035 Android Volley框架进行网络请求
1.volley入门介绍
开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。
Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
下图所示的这些应用都是属于数据量不大,但网络通信频繁的,因此非常适合使用Volley。
2.volley的使用环境配置
(1)添加volley的依赖
github地址:https://github.com/mcxiaoke/android-volley
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(非常经典)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)