Android之Volley的使用

1.创建一个全局的请求队列:

public class MyApplication extends Application {
//    创建一个全局的请求队列
    public static RequestQueue queues;
    @Override
    public void onCreate() {
        super.onCreate();
        queues = Volley.newRequestQueue(getApplicationContext());
    }
//    暴露方法用来获取请求队列
    public static RequestQueue getHttpQueues(){
        return queues;
    }
}
注:在AndroidManifest.xml中注册MyApplication,并添加网络权限。

2.Volley的GET请求:

数据类型为StringRequest

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        volley_Get();

    }
    private void volley_Get() {
        String url = "http;//apis.juhe.cn/mobile/get?phone=12345678912&key=3uu9ue84";    //请求的接口地址
        StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
//            数据请求成功
            @Override
            public void onResponse(String s) {
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
//            数据请求失败
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
            }
        });
//        通过Tag标签在请求队列中找到该请求
        request.setTag("abcGet");
//        将该Request添加到全局请求队列中
        MyApplication.getHttpQueues().add(request);
    }
}
数据类型是JsonObjectRequest
private void volley_Get(){
String url = "http;//apis.juhe.cn/mobile/get?phone=12345678912&key=3uu9ue84";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
            }
        });
        //        通过Tag标签在请求队列中找到该请求
        request.setTag("abcGet");
        //        将该Request添加到全局请求队列中
        MyApplication.getHttpQueues().add(request);
       }
}
数据类型是JsonArrayRequest与JsonObjectRequest类似

JsonArrayRequest request = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray jsonArray) {
            Toast.makeText(MainActivity.this, jsonArray.toString(), Toast.LENGTH_LONG).show();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_LONG).show();
        }
    });
3.Volley的Post请求

getParams()方法:用户在Volley中使用post方式请求数据中参数的传递

数据类型为StringRequest

    private void volley_Post() {
//        因为是Post请求所以参数不能直接写在url里面,所以有一个单独实现参数的方法叫getParams()
        String url = "http;//apis.juhe.cn/mobile/get?";
        StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> hashMap = new HashMap<String, String>();
                hashMap.put("phone","12345678912");
                hashMap.put("key","key=3uu9ue84");
                return hashMap;
            }
        };
        request.setTag("abcPost");
        MyApplication.getHttpQueues().add(request);
    }
数据类型是JsonObjectRequest   

        HashMap<String,String> map = new HashMap<String, String>();
        map.put("phone","12345678912");
        map.put("key","key=3uu9ue84");
        JSONObject object = new JSONObject(map);
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, object, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
            }
        });
        request.setTag("abcPost");
        MyApplication.getHttpQueues().add(request);
    }
数据类型是JsonArrayRequest与JsonObjectRequest类似


总结:1.当数据类型是StringRequestt时,当Method为Get时,参数都在url里面,

          当Method为Post时,用方法getParams()用于请求数据中参数的传递(用HashMap来存储参数)

            2.当数据类型是JsonObjectRequest时,当Method为Get时,JsonObject的构造方法中类型为JsonObject的参数为null,如下:

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {.....},new         Response.ErrorListener(){.....});
       当Method为Post时,如下:

        HashMap<String,String> map = new HashMap<String, String>();
        map.put("phone","12345678912");
        map.put("key","key=3uu9ue84");
        JSONObject object = new JSONObject(map);
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url,object, new Response.Listener<JSONObject>() {....},new <span style="white-space:pre">	</span>Response.ErrorListener(){...});
4.volley与Activity联动

在onStop()方法中使用cancelAll()方法——通过给定的tag值,将指定的队列全部关闭。

    @Override
    protected void onStop() {
        MyApplication.getHttpQueues().cancelAll("abcGet");
        super.onStop();
    }
5.volley的简单的二次回调封装——其实是对请求成功和请求失败的封装

private void volley_Get() {
        String url = "http;//apis.juhe.cn/mobile/get?phone=12345678912&key=3uu9ue84";    //请求的接口地址
        VolleyRequest request = new VolleyRequest();
        String tag = "abcGet";
        request.RequestGet(this, url, tag, new VolleyInterface(this,VolleyInterface.mListener,VolleyInterface.mErrorListener) {
            @Override
            public void onMySuccess(String result) {
                Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
            }

            @Override
            public void onMyError(VolleyError error) {
                Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
            }
        });
    }
}

public class VolleyRequest {
    public static StringRequest stringRequest;
    public static Context context;
    public static void RequestGet(Context mContext,String url,String tag,VolleyInterface vif){
//      防止重复请求来消耗内存
        MyApplication.getHttpQueues().cancelAll(tag);
        StringRequest request = new StringRequest(Request.Method.GET, url,vif.loadingListener(),vif.errorListener());
        request.setTag("abcGet");
//        将该请求添加到队列中
        MyApplication.getHttpQueues().add(request);
        MyApplication.getHttpQueues().start();
    }

    public static void RequestPost(Context mContext,String url,String tag, final Map<String,String> params,VolleyInterface vif){
        MyApplication.getHttpQueues().cancelAll(tag);
        StringRequest request = new StringRequest(Request.Method.POST,url,vif.loadingListener(),vif.errorListener()){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };
        request.setTag(tag);
        MyApplication.getHttpQueues().add(request);
        MyApplication.getHttpQueues().start();
    }
}

public abstract class VolleyInterface {
    public Context mContext;
    public static Response.Listener<String> mListener;
    public static Response.ErrorListener mErrorListener;
    public VolleyInterface(Context context,Response.Listener<String> listener,Response.ErrorListener errorListener) {
        this.mContext = context;
        this.mListener = listener;
        this.mErrorListener = errorListener;
    }
    public abstract void onMySuccess(String result);
    public abstract void onMyError(VolleyError error);

    public Response.Listener<String> loadingListener() {
        mListener = new Response.Listener<String>() {
//            弹出加载中
            @Override
            public void onResponse(String s) {
                onMySuccess(s);
            }
        };
        return mListener;
    }
    public Response.ErrorListener errorListener(){
        mErrorListener = new Response.ErrorListener() {
//            提示请求失败
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                onMyError(volleyError);
            }
        };
      return mErrorListener;
    }
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值