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;
}
}