Volley拦截OnErrorResponse返回之前

时间:2015-01-09 03:47:34

标签: android error-handling android-volley http-status-code-401

我正在使用排球来向网络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) {                
    }   
 }

0 个答案:

没有答案