zoukankan      html  css  js  c++  java
  • 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(非常经典)

  • 相关阅读:
    OPPO R9sPlus MIFlash线刷TWRP Recovery ROOT详细教程
    OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
    努比亚(nubia) M2青春版 NX573J 解锁BootLoader 并进入临时recovery ROOT
    华为 荣耀 等手机解锁BootLoader
    青橙 M4 解锁BootLoader 并刷入recovery ROOT
    程序员修炼之道阅读笔03
    冲刺8
    典型用户模板分析
    学习进度八
    冲刺7
  • 原文地址:https://www.cnblogs.com/luckyplj/p/10932393.html
Copyright © 2011-2022 走看看