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

原文地址:https://www.cnblogs.com/luckyplj/p/10932393.html