1.volley入门介绍java
开发Android应用的时候不可避免地都须要用到网络技术,而多数状况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通讯,HttpURLConnection和HttpClient,几乎在任何项目的代码中咱们都能看到这两个类的身影,使用率很是高。android
Volley但是说是把AsyncHttpClient和Universal-Image-Loader的优势集于了一身,既能够像AsyncHttpClient同样很是简单地进行HTTP通讯,也能够像Universal-Image-Loader同样轻松加载网络上的图片。除了简单易用以外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是很是适合去进行数据量不大,但通讯频繁的网络操做,而对于大数据量的网络操做,好比说下载文件等,Volley的表现就会很是糟糕。git
下图所示的这些应用都是属于数据量不大,但网络通讯频繁的,所以很是适合使用Volley。github
2.volley的使用环境配置web
(1)添加volley的依赖算法
github地址:https://github.com/mcxiaoke/android-volleyjson
implementation 'com.mcxiaoke.volley:library:1.0.19'
(2)声明网络权限缓存
//网络权限,当禁用后,没法进行检索等相关业务 <uses-permission android:name="android.permission.INTERNET" />
3.StringRequest的用法服务器
(1)获取到一个RequestQueue对象网络
//取得请求队列 RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
RequestQueue是一个请求队列对象,它能够缓存全部的HTTP请求,而后按照必定的算法并发地发出这些请求。RequestQueue内部的设计就是很是合适高并发的,所以咱们没必要为每一次HTTP请求都建立一个RequestQueue对象,这是很是浪费资源的,基本上在每个须要和网络交互的Activity中建立一个RequestQueue对象就足够了。
(2)建立一个StringRequest对象
(3)将这个StringRequest对象添加到RequestQueue里面就能够了
//将请求添加到队列中 requestQueue.add(request);
4.使用案例
package com.example.administrator.test66smartbeijing.fragment; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.example.administrator.test66smartbeijing.R; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; /** * 利用tabLayout+viewPager实现带顶部菜单栏的fragment */ public class NewsCenterVolleyFragment extends Fragment { //handler用来处理消息 @SuppressLint("HandlerLeak") Handler handler=new Handler(){ @SuppressLint("ResourceType") @Override public void handleMessage(Message msg) { //更新ui if(msg.what==0x01){ //接收到消息后,从当前的fragment跳转到另外一个activity中 String queryResultStr= (String) msg.obj; } } }; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { getDataFromServer(); View view=inflater.inflate(R.layout.layout_fm_newscenter_volley,container,false); return view; } private void getDataFromServer() { //请求地址 String url = "http://118.25.152.62:8080/SmartBeijingJavaWeb_war/JsonServlet"; //注① String tag = "BasicMessage"; //注② //取得请求队列 final RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); //防止重复请求,因此先取消tag标识的请求队列 requestQueue.cancelAll(tag); //建立StringRequest,定义字符串请求的请求方式为POST(省略第一个参数会默认为GET方式) //一个StringRequest对象,StringRequest的构造函数须要传入4个参数。 // 第1个参数就是http请求的方式:Request.Method.POST,第2个参数就是目标服务器的URL地址:url。 // 第3个参数是服务器响应成功的回调:new Response.Listener<String>(),第4个参数是服务器响应失败的回调:new Response.ErrorListener()。 final StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { try { String queryResultStr=""; //注意:当response为空时,说明服务器无响应(服务器端的代码有问题) if(!TextUtils.isEmpty(response)){ JSONObject jsonObject = (JSONObject) new JSONObject(response).get("params"); //注③ queryResultStr=jsonObject.toString(); System.out.println(queryResultStr); //当服务器链接成功,得到响应后,用Message对象传递消息,在Activity或fragment中处理。 Message message=new Message();//实例化message message.what=0x01;//设置消息发送的验证码 message.obj=queryResultStr;//设置消息的内容 handler.sendMessage(message); //利用handler发送消息 }else { Toast.makeText(getActivity(),"请求未响应",Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { //作本身的请求异常操做,如Toast提示(“无网络链接”等) Log.e("TAG", e.getMessage(), e); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //作本身的响应错误操做,如Toast提示(“请稍后重试”等) Log.e("TAG", error.getMessage(), error); } }) { //设置要提交给服务器的参数,若无需提交参数给服务器,能够不重写该方法 @Override protected Map<String, String> getParams() throws AuthFailureError { //建立一个Map集合,用于存储元素对(称做“键”和“值”),其中每一个键映射到一个值 Map<String, String> params = new HashMap<>(); return params; } }; //设置Tag标签 request.setTag(tag); //将请求添加到队列中 requestQueue.add(request); } }
注意:url请求是用servlet,服务器端的javaweb必须采用servlet,即服务器和客户端的请求要相互匹配。
5.控制台输出从服务器获取的json数据。
System.out: {"Result":"{\"retcode\":200,\"data\":[{\"id\":10000,\"title\":\"新闻\",\"type\":1,\"children\":[{\"id\":10007,\"title\":\"北京\",\"type\":1,\"url\":\"\/10007\/list_1.json\"},{\"id\":10006,\"title\":\"中国\",\"type\":1,\"url\":\"\/10006\/list_1.json\"},{\"id\":10008,\"title\":\"国际\",\"type\":1,\"url\":\"\/10008\/list_1.json\"},{\"id\":10010,\"title\":\"体育\",\"type\":1,\"url\":\"\/10010\/list_1.json\"},{\"id\":10091,\"title\":\"生活\",\"type\":1,\"url\":\"\/10091\/list_1.json\"},{\"id\":10012,\"title\":\"旅游\",\"type\":1,\"url\":\"\/10012\/list_1.json\"},{\"id\":10095,\"title\":\"科技\",\"type\":1,\"url\":\"\/10095\/list_1.json\"},{\"id\":10009,\"title\":\"军事\",\"type\":1,\"url\":\"\/10009\/list_1.json\"},{\"id\":10093,\"title\":\"时尚\",\"type\":1,\"url\":\"\/10093\/list_1.json\"},{\"id\":10011,\"title\":\"财经\",\"type\":1,\"url\":\"\/10011\/list_1.json\"},{\"id\":10094,\"title\":\"育儿\",\"type\":1,\"url\":\"\/10094\/list_1.json\"},{\"id\":10105,\"title\":\"汽车\",\"type\":1,\"url\":\"\/10105\/list_1.json\"}]},{\"id\":10002,\"title\":\"专题\",\"type\":10,\"url\":\"\/10006\/list_1.json\",\"url1\":\"\/10007\/list1_1.json\"},{\"id\":10003,\"title\":\"组图\",\"type\":2,\"url\":\"\/10008\/list_1.json\"},{\"id\":10004,\"title\":\"互动\",\"type\":3,\"excurl\":\"\",\"dayurl\":\"\",\"weekurl\":\"\"}],\"extend\":[10007,10006,10008,10014,10012,10091,10009,10010,10095]}"}
参考文献:https://blog.csdn.net/Mr_Megamind/article/details/71404618(很是经典)