Автономный режим с Retrofit 2 Cache-Control - PullRequest
0 голосов
/ 08 июня 2018

Я работаю над приложением для Android, для которого требуется автономный режим, я использую модификацию 2 с контролем кэша, но сталкиваюсь с проблемой, что файлы кэша не создаются, и в этой папке создается только файл с именем journal.Iразмещение моего кода файла ApiClient.java здесь.

public class ApiClient {

public static final String BASE_URL = "http://www.something.com/";
private static Retrofit retrofit = null;
private static APIInterfaces apiInterface;
private  static Context mcontext=getApplicationContext();


static Interceptor OFFLINE_INTERCEPTOR = new Interceptor() {
    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        if (!isConnected()) {
            int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
            request = request.newBuilder()
                    .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                    .build();
        }

        return chain.proceed(request);
    }
};


static Interceptor ONLINE_INTERCEPTOR = new Interceptor() {
    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        okhttp3.Response response = chain.proceed(chain.request());
        int maxAge = 60; // read from cache
        return response.newBuilder()
                .header("Cache-Control", "public, max-age=" + maxAge)
                .build();
    }
};



protected static Retrofit getClient() {
    if (retrofit == null) {

        createFolder();
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();


        OkHttpClient okHttpClient = new OkHttpClient
                .Builder()
                .cache(new Cache(new File(Environment.getExternalStorageDirectory() + File.separator + "something"), 10 * 1024 * 1024)) // 10 MB
                .addInterceptor(OFFLINE_INTERCEPTOR)
                .addNetworkInterceptor(ONLINE_INTERCEPTOR)
                .build();

        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL).client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }
    return retrofit;
}


public static APIInterfaces getApiInterface() {
    if (apiInterface == null)
        apiInterface = ApiClient.getClient().create(APIInterfaces.class);
    return apiInterface;
}



private static boolean isConnected() {
    try {
        android.net.ConnectivityManager e = (android.net.ConnectivityManager) mcontext.getSystemService(
                Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = e.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    } catch (Exception e) {
        Log.w(TAG, e.toString());
    }

    return false;
}

public  static boolean isStoragePermissionGranted() {
    if (Build.VERSION.SDK_INT >= 23) {
        if (mcontext.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            ActivityCompat.requestPermissions((Activity) mcontext,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    }
    else { //permission is automatically granted on sdk<23 upon installation
        return true;
    }
}



private static void createFolder() {
    if (isStoragePermissionGranted()) {
        File folder = new File(Environment.getExternalStorageDirectory() + File.separator + "Something");

        if (!folder.exists()) {
            folder.mkdir();
        }
    }
}

}

Может кто-нибудь объяснить, в чем проблема с кодом выше.

1 Ответ

0 голосов
/ 08 июня 2018

Когда вы используете перехватчики для изменения заголовков, он не вносит никаких изменений до вызова CacheStrategy.isCacheable().

Попробуйте изменить interceptors() с помощью вызова networkInterceptors().

Посмотрите здесь: https://github.com/square/okhttp/wiki/Interceptors

Кроме того, вы не можете кэшировать POST-запросы с помощью кэша OkHttp.Вам нужно будет хранить их, используя какой-то другой механизм, смотри это

Другие механизмы:

Существует несколько методов, один из которых можно сохранитьон-лайн результаты в локальную базу данных и извлекают ее оттуда, если в автономном режиме, что делает большинство людей, второй вариант заключается в переопределении OKHTTP, но это будет дорого для мобильного устройства с точки зрения производительности по сравнению с выгодой, третий явно конвертируетваша структура POST API для GET

Но посмотрите здесь она также содержит статью блога, которая поможет вам.

...