Activity关闭时取消请求队列中的请求:
可以在上一篇博客中的例子MainActivity的onStop方法中添加如下代码:
@Override
protected void onStop() {
super.onStop();
//通过Tag标签取消请求队列中对应的全部请求
MyApplication.getHttpQueue().cancelAll("abcPost");
}
Volley简单的二次回调封装
二次封装的好处在于,可以在接口中统一设置提示信息,不需要在每个方法中都写一遍。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.learning.volleydemo03">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name=".MyApplication">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MyApplication.java
import android.app.Application;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
public class MyApplication extends Application {
public static RequestQueue queue;
@Override
public void onCreate() {
super.onCreate();
queue = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueue(){
return queue;
}
}
创建一个抽象类,封装两个关键的方法
VolleyInterface.java
import android.content.Context;
import com.android.volley.Response;
import com.android.volley.VolleyError;
public abstract class VolleyInterface {
//上下文
public static Context context;
//请求成功
public static Response.Listener<String> listener;
//请求失败
public static Response.ErrorListener errorListener;
public VolleyInterface(Context mContext, Response.Listener<String> mListener, Response.ErrorListener mErrorListener){
this.context = mContext;
this.listener = mListener;
this.errorListener = mErrorListener;
}
public abstract void onMySuccess(String result);
public abstract void onMyError(VolleyError error);
//请求成功的监听方法
public Response.Listener<String> loadingListener(){
//请求成功实例化
listener = new Response.Listener<String>() {
@Override
public void onResponse(String s) {
//这里可以添加成功提示
onMySuccess(s);
}
};
return listener;
}
//请求失败的监听方法
public Response.ErrorListener errorListener(){
//请求失败实例化
errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
onMyError(volleyError);
//这里可以添加成功提示
}
};
return errorListener;
}
}
创建一个请求管理VolleyRequest
VolleyRequest.java
import android.content.Context;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.toolbox.StringRequest;
import java.util.Map;
public class VolleyRequest {
public static StringRequest stringRequest;
public static Context context;
public static void RequestGet(
Context mContext,//上下文
String url,
String tag,
VolleyInterface vif)//请求回调的接口,请求成功和失败
{
//防止重复请求
MyApplication.getHttpQueue().cancelAll(tag);
stringRequest = new StringRequest(Request.Method.GET,url,
vif.loadingListener(),vif.errorListener());
stringRequest.setTag(tag);
//请求添加到队列中
MyApplication.getHttpQueue().add(stringRequest);
MyApplication.getHttpQueue().start();
}
public static void RequestPost(
Context mcontext,//上下文
String url,
String tag,
final Map<String,String> params,//请求参数,通过Map传递
VolleyInterface vif)//回调接口
{
//获取请求队列,cancelAll防止重复请求
MyApplication.getHttpQueue().cancelAll(tag);
stringRequest = new StringRequest(url,vif.loadingListener(),
vif.errorListener()){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
stringRequest.setTag(tag);
MyApplication.getHttpQueue().add(stringRequest);
MyApplication.getHttpQueue().start();
}
}
MainActivity.java
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.android.volley.VolleyError;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
volley_Get();
}
public void volley_Get() {
String url=
"https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";
VolleyRequest.RequestGet(this, url, "abcGet",
new VolleyInterface (this,VolleyInterface.listener,VolleyInterface.errorListener) {
@Override
public void onMySuccess(String result) {
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
@Override
public void onMyError(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
}
});
}
}
运行结果: