2

我正在创建一个使用 OkHttp 网络库作为 HTTP 客户端的 Android 应用程序。我共享一个OkHttpClient缓存大小为 10 MB 的实例。流程是:我向服务器发送请求,服务器对其进行处理并生成ETag标头,OkHttp 应该将其If-None-Match连接到以下对同一 URL 的请求中的标头中。问题是If-None-Match请求的标头中缺少标头,因此Response.cacheResponse()总是返回null. 所以我的问题是:如何解决这个问题以使用响应缓存?

OkHttpClientSingleton.java:

public class OkHttpClientSingleton
{
   private static OkHttpClientSingleton sOkHttpClientSingleton;

   private OkHttpClient mOkHttpClient;

   public static OkHttpClientSingleton get(Context context)
   {
       if(sOkHttpClientSingleton == null)
       {
           sOkHttpClientSingleton = new OkHttpClientSingleton(context);
       }

       return sOkHttpClientSingleton;
   }

   public OkHttpClientSingleton(Context context)
   {
       int cacheSize = 10 * 1024 * 1024;
       Cache cache = new Cache(context.getCacheDir(), cacheSize);

       mOkHttpClient = new OkHttpClient.Builder()
               .cache(cache)
               .addNetworkInterceptor(new LoggingInterceptor())
               .build();
   }

   public void addRequest(Request request, Callback responseCallback, ProgressDialog progressDialog)
   {
       if(progressDialog != null && !progressDialog.isShowing())
           progressDialog.show();

       mOkHttpClient.newCall(request).enqueue(responseCallback);
   }
}

发送请求代码片段:

RequestBody formBody = new FormBody.Builder()
                    .add("data", data)
                    .build();

Request request = new Request.Builder()
                    .url(url)
                    .post(formBody)
                    .build();

Callback responseCallback = new Callback()
{
    @Override
    public void onFailure(Call call, IOException e)
    {
        // Do something
    }

    @Override
    public void onResponse(Call call, Response response)
    {
        dismissProgressDialog();

        Gson gson = new GsonBuilder()
                      .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                      .create();

        Response cacheResponse = response.cacheResponse(); // Always null

        if(response.isSuccessful())
        {
            if(response.code() == 200)
            {                   
                // Deserialize json using gson
            }
        }
        else
        {
            if(response.code() == 400)
            {
                // Deserialize json using gson
            }
        }
    }
};

OkHttpClientSingleton.get(getContext()).addRequest(request, responseCallback, getProgressDialog());

可以在此处查看来自网络拦截器的两个相同请求的日志。

我在互联网上发现了很多类似的问题,但没有一个能帮助我解决这个问题。

任何帮助将非常感激。

4

0 回答 0