我正在使用排球来向网络API发出网络请求。
我目前的设置如下:
这是我的单身人士课程:
public class Network {
public static final String BaseUrl = "http://menu.fsknetworks.com:80/api/v1/";
public static String TAG = "Network";
private static Network mInstance;
private static RequestQueue mRequestQueue;
private static ImageLoader mImageLoader;
private static Context mCtx;
private static String mToken;
//Used to get a new access Token, expires every year
private static String RefreshToken;
private Network(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
mToken = "";
mImageLoader = new ImageLoader(mRequestQueue,
new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap> cache = new LruCache<String, Bitmap>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
public static synchronized Network getInstance(Context context) {
if (mInstance == null) {
mInstance = new Network(context);
}
return mInstance;
}
public static String getToken() {
return mToken;
}
public static void setToken(String token) {
mToken = token;
}
public static ImageLoader getImageLoader() {
return mImageLoader;
}
public static String getFullUrl(String url) {
return BaseUrl + url;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley
.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
req.setRetryPolicy(new DefaultRetryPolicy(30000, 1, 2));
try {
req.getHeaders().put("Authorization", "Bearer " + getToken());
} catch (AuthFailureError e) {
e.printStackTrace();
}
Log.d(TAG, PrintRequest(req));
getRequestQueue().add(req);
}}
现在我使用访问令牌和刷新令牌与API通信。访问令牌仅在30分钟内有效,直至过期。
如果我发出获得401错误响应的请求,我希望网络类自动发出另一个请求来获取最新的访问令牌。
所以我想添加这样的东西,我只是不知道要覆盖什么或者我可以做什么,我认为它会在AddRequestToQueue()
函数中的某些地方。
public void OveriddenErrorResponseMethod(VolleyError error)
{
if (error.getErrorResponse == 401)
{
// Build up new request to refresh access token
//Send Blocking Network Request.
//Resend the Initial request with the new access token:
if(succefull)
{
call the OnResponse() callback method with the correct content
}else{
// call Volley onError callback and do nothing
super(error) ???/ or Return error?
}
或者我可以这样做:
重写ErrorListener类,并在那里实现我的逻辑?
public CustomErrorListner extends ErrorListener{
// Overide onErrorResponse(VolleyError error) {
}
}