нестатическая и статическая проблема с кэшированием при модернизации - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу использовать кэш при модернизации, но получаю ошибку из-за 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(), что он не может быть нестатичным.

Как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

После долгих поисков я узнал, что ответ: Context

 public static <S> S createService(Class<S> serviceClass,Context mContext) {
     File dir = new File(mContext.getCacheDir(),"http-cache");
     ...
 }
0 голосов
/ 10 февраля 2019

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, будет создаватьуслуга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...