Volley使用单身

时间:2018-03-14 17:26:19

标签: java android android-volley

我正在做以下完美的工作

    //else proceed with the checks
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
            Request.Method.GET,
            checkauthurl,
            null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(String response) { 
                         //do stuff here
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                   // do stuff here
                }
            }) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    HashMap<String, String> headers = new HashMap<String, String> ();
                    TokenService tokenservice = new TokenService(ctx);
                    String accesstoken = tokenservice.getToken(ApiHelper.ACCESS_TOKEN_SHARED_PREF);
                    headers.put("Authorization", "Bearer " + accesstoken);

                    return headers;
              }
    };

    // Access the RequestQueue through your singleton class.
    ApiSingleton strngle = new ApiSingleton(ctx);
    strngle.addToRequestQueue(jsonObjectRequest);

对于每个请求,我都要添加请求标头。如何直接在单例中设置请求标头。

这是我的单身人士

private static ApiSingleton mInstance;
private RequestQueue mRequestQueue;
public static Context mCtx;
private ImageLoader mImageLoader;

public ApiSingleton(Context context) {
    mCtx = context;
    mRequestQueue = getRequestQueue();
    //do stuff
}

public RequestQueue getRequestQueue() {
    if (mRequestQueue == null) {
        // getApplicationContext() is key, it keeps you from leaking the
        // Activity or BroadcastReceiver if someone passes one in.
        mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
    }
    return mRequestQueue;
}

在每个请求中附加承载令牌时,如何避免上述代码重复?

3 个答案:

答案 0 :(得分:0)

  1. 你可以写一个&#34;工厂&#34;使用一个方法来获取checkauthurlctx并返回JsonObjectRequest的实例。如果在您的情况下有意义,您的工厂可以实现一些逻辑来重复使用具有相同auth Url的对象。
  2. 您可以对JsonObjectRequest进行细分,并将checkauthurlctx作为参数提供给构造函数。同样,您可以实现一个方案来重用对象
  3. 如果您想要依赖注入,工厂将是建议的方法。

    我建议不要预先分配Token并在多个请求中使用它。代币过期。如果TokenService编写得很好,它应该知道令牌何时到期并根据需要刷新(如果可能的话)。

答案 1 :(得分:0)

public class CustomJsonRequest extends JsonRequest<Object>{
    public CustomJsonRequest(String url, String requestBody, Response.Listener<Object> listener,
                       Response.ErrorListener errorListener) {
        super(url, requestBody, listener, errorListener);
    }

    public CustomJsonRequest(int method, String url, String requestBody, Response.Listener<Object> listener,
                       Response.ErrorListener errorListener) {
        super(method, url, errorListener);
    }
    @Override
    protected Response<Object> parseNetworkResponse(NetworkResponse response) {
        return Response.success(Object, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<String, String> ();
        TokenService tokenservice = new TokenService(ctx);
        String accesstoken = tokenservice.getToken(ApiHelper.ACCESS_TOKEN_SHARED_PREF);
        headers.put("Authorization", "Bearer " + accesstoken);
        return headers;
    }
}

您可以扩展JsonRequest类并覆盖getHeaders()方法。 在队列中添加排球请求时,传递CustomJsonRequest对象的实例。

VolleyUtils.getInstance().addToRequestQueue(customJsonRequest); 

答案 2 :(得分:-2)

创建一个AppController.java文件,并在清单标记中将此文件名称为android:app。

public class AppController extends Application {

    public static final String TAG = AppController.class.getSimpleName();
    private RequestQueue mRequestQueue;
    private static AppController mInstance;
    private ImageLoader mImageLoader;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }
    public static synchronized AppController getInstance() {
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        }
        return mRequestQueue;
    }

    public ImageLoader getImageLoader() {
        getRequestQueue();
        if (mImageLoader == null) {
            mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache());
        }
        return this.mImageLoader;
    }
    public <T> void addToRequestQueue(Request<T> req, String tag) {
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(req);
    }
    public <T> void addToRequestQueue(Request<T> req) {
        req.setTag(TAG);
        getRequestQueue().add(req);
    }
    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
}

做网络代码

 StringRequest strReq = new StringRequest(Request.Method.POST, AppConfig.URL_BUYER_LOGIN, 
new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {

                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {

                }
            }) {
                @Override
                protected Map<String, String> getParams() {

                }
            };
            // Adding request to request queue
            AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
        }