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(非常经典)

  • 相关阅读:
    Qt开发的应用记录读取用户习惯设置的方法
    Windows软件Everything的配置
    C语言的类型大小
    Petalinux和Vivado的安装
    Linux下MiniGUI库的安装
    Linux下的screen和作业任务管理
    Linux下的upx命令学习
    Linux下的strip命令学习
    地址解析协议(ARP)
    IP 地址结构
  • 原文地址:https://www.cnblogs.com/luckyplj/p/10932393.html
Copyright © 2011-2022 走看看