改造中的缓存存在非静态和静态问题



我想在改造中使用缓存,但由于getCacheDir();而出现错误

这是我的代码:

public class ServiceGenerator extends AppCompatActivity {
    public static final String API_BASE_URL = "https://myapiurl.com/";
    private static HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    private static Interceptor logging = interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
    static File dir = getCacheDir();
    static Cache cache = new Cache(dir,10*1024*1024);
    private static OkHttpClient httpClient = new OkHttpClient.Builder()
            .cache(cache)
            .addInterceptor(logging)
            .build();
    private static Gson gson = new GsonBuilder()
            .setLenient()
            .create();
    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create(gson));
    public static <S> S createService(Class<S> serviceClass) {
        Retrofit retrofit = builder.client(httpClient).build();
        return retrofit.create(serviceClass);
    }

}

错误是"无法从静态上下文引用非静态方法'getCacheDir(('">

所以我删除了所有静态变量,我得到了另一个关于createService()它不可能是非静态的错误。

如何解决此问题?

getCacheDir()不是static方法,因此不能通过静态字段/方法调用。首先,您必须创建ServiceGenerator实例。我建议您将所有字段和方法设置为常规(非静态(,并在回调中调用/分配它们ServiceGenerator onCreate

public class ServiceGenerator extends AppCompatActivity {
    private static final String API_BASE_URL = "https://myapiurl.com/";
    private Retrofit retrofit;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC);
        Cache cache = new Cache(getCacheDir(), 10 * 1024 * 1024);
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        OkHttpClient httpClient = new OkHttpClient.Builder()
                .cache(cache)
                .addInterceptor(loggingInterceptor)
                .build();
        retrofit = new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .client(httpClient)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }
    protected <S> S createService(Class<S> serviceClass) {
        return retrofit.create(serviceClass);
    }
}

每个扩展ServiceGenerator的活动都会创建一个服务。

经过大量搜索,我发现答案是Context

 public static <S> S createService(Class<S> serviceClass,Context mContext) {
     File dir = new File(mContext.getCacheDir(),"http-cache");
     ...
 }

最新更新