Кэшинга не работала на работе при добавлении интернет-соединения перехвата (модернизация 2 - Android) -- android поле с участием kotlin поле с участием caching поле с участием retrofit2 поле с участием interceptor пол Связанный проблема

Caching didn't work work when adding Internet Connection Interceptor (Retrofit 2 - Android)


0
vote

проблема

русский

Я пытаюсь реализовать интернет-соединение перехватчика с кэшированием с помощью модернизации и OKHTTP.

Кэширование работает нормально, не добавляя интернет-соединение перехватчика, но когда я добавляю интернет-соединение перехватчик для подключения к клиенту OKHTTP, перехватчик подключения к Интернету работает нормально, но кэширование не работало.

Они работают нормально отдельно, но когда я добавляю кэширование и интернет-перехватчик вместе кэширование не работают и подключение к подключению к Интернету.

Вот что я уже сделал:

 <код> val cacheSize = (5 * 1024 * 1024).toLong() val myCache = Cache(context!!.cacheDir, cacheSize)  val okHttpClient = OkHttpClient.Builder()                 .cache(myCache)                 .addInterceptor(offlineInterceptor)                 .addNetworkInterceptor(onlineInterceptor)                 .addInterceptor(NoConnectionInterceptor(context))                 .build()   Retrofit.Builder()          .baseUrl(Constants.REGISTRATION_BASE_URL)          .client(okHttpClient)          .addConverterFactory(GsonConverterFactory.create())          .build()   

Когда я удаляю <код> NoConnectionInterceptor(context) кэширование работает отлично

 <код>  var onlineInterceptor: Interceptor = object : Interceptor {         @Throws(IOException::class)         override fun intercept(chain: Interceptor.Chain): Response {             val response: Response = chain.proceed(chain.request())             val maxAge =                 60 // read from cache for 60 seconds even if there is internet connection             return response.newBuilder()                 .header("Cache-Control", "public, max-age=$maxAge")                 .removeHeader("Pragma")                 .build()         }     }      var offlineInterceptor: Interceptor = object : Interceptor {         @Throws(IOException::class)         override fun intercept(chain: Interceptor.Chain): Response {             var request: Request = chain.request()             if (!hasNetwork()!!) {                 val maxStale = 60 * 60 * 24 * 30 // Offline cache available for 30 days                 request = request.newBuilder()                     .header("Cache-Control", "public, only-if-cached, max-stale=$maxStale")                     .removeHeader("Pragma")                     .build()             }             return chain.proceed(request)         }     }   

<сильный> NoconnectionInterceptor класс

 <код> @Singleton class NoConnectionInterceptor @Inject constructor(private val context: Context) : Interceptor {     override fun intercept(chain: Interceptor.Chain): Response {         return if (!isConnectionOn()) {             throw NoConnectivityException()         } else if (!isInternetAvailable()) {             throw NoInternetException()         } else {             chain.proceed(chain.request())         }     }      private fun isConnectionOn(): Boolean {         val connectivityManager =             context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager          if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {             val network = connectivityManager.activeNetwork             val connection = connectivityManager.getNetworkCapabilities(network)             return connection != null && (                     connection.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||                             connection.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))         } else {             val activeNetwork = connectivityManager.activeNetworkInfo             if (activeNetwork != null) {                 return (activeNetwork.type == ConnectivityManager.TYPE_WIFI ||                         activeNetwork.type == ConnectivityManager.TYPE_MOBILE)             }             return false         }     }      private fun isInternetAvailable(): Boolean {         return try {             val timeoutMs = 1500             val sock = Socket()             val sockaddr = InetSocketAddress("8.8.8.8", 53)              sock.connect(sockaddr, timeoutMs)             sock.close()              true         } catch (e: IOException) {             false         }      }      class NoConnectivityException : IOException() {         override val message: String             get() = "No network available, please check your WiFi or Data connection"     }      class NoInternetException : IOException() {         override val message: String             get() = "No internet available, please check your connected WIFi or Data"     } }   
Английский оригинал

I'm trying to implement internet connection interceptor with caching using Retrofit and OkHttp.

Caching works fine without adding Internet Connection Interceptor but When I add internet connection interceptor to OkHttp Client internet connection interceptor works fine but caching didn't work.

They work fine separately but when I add caching and Internet Interceptor together caching didn't work and Internet Connection interceptor works.

Here what I've already done:

val cacheSize = (5 * 1024 * 1024).toLong() val myCache = Cache(context!!.cacheDir, cacheSize)  val okHttpClient = OkHttpClient.Builder()                 .cache(myCache)                 .addInterceptor(offlineInterceptor)                 .addNetworkInterceptor(onlineInterceptor)                 .addInterceptor(NoConnectionInterceptor(context))                 .build()   Retrofit.Builder()          .baseUrl(Constants.REGISTRATION_BASE_URL)          .client(okHttpClient)          .addConverterFactory(GsonConverterFactory.create())          .build() 

when I remove NoConnectionInterceptor(context) caching works fine

 var onlineInterceptor: Interceptor = object : Interceptor {         @Throws(IOException::class)         override fun intercept(chain: Interceptor.Chain): Response {             val response: Response = chain.proceed(chain.request())             val maxAge =                 60 // read from cache for 60 seconds even if there is internet connection             return response.newBuilder()                 .header("Cache-Control", "public, max-age=$maxAge")                 .removeHeader("Pragma")                 .build()         }     }      var offlineInterceptor: Interceptor = object : Interceptor {         @Throws(IOException::class)         override fun intercept(chain: Interceptor.Chain): Response {             var request: Request = chain.request()             if (!hasNetwork()!!) {                 val maxStale = 60 * 60 * 24 * 30 // Offline cache available for 30 days                 request = request.newBuilder()                     .header("Cache-Control", "public, only-if-cached, max-stale=$maxStale")                     .removeHeader("Pragma")                     .build()             }             return chain.proceed(request)         }     } 

NoConnectionInterceptor class

@Singleton class NoConnectionInterceptor @Inject constructor(private val context: Context) : Interceptor {     override fun intercept(chain: Interceptor.Chain): Response {         return if (!isConnectionOn()) {             throw NoConnectivityException()         } else if (!isInternetAvailable()) {             throw NoInternetException()         } else {             chain.proceed(chain.request())         }     }      private fun isConnectionOn(): Boolean {         val connectivityManager =             context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager          if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {             val network = connectivityManager.activeNetwork             val connection = connectivityManager.getNetworkCapabilities(network)             return connection != null && (                     connection.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||                             connection.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))         } else {             val activeNetwork = connectivityManager.activeNetworkInfo             if (activeNetwork != null) {                 return (activeNetwork.type == ConnectivityManager.TYPE_WIFI ||                         activeNetwork.type == ConnectivityManager.TYPE_MOBILE)             }             return false         }     }      private fun isInternetAvailable(): Boolean {         return try {             val timeoutMs = 1500             val sock = Socket()             val sockaddr = InetSocketAddress("8.8.8.8", 53)              sock.connect(sockaddr, timeoutMs)             sock.close()              true         } catch (e: IOException) {             false         }      }      class NoConnectivityException : IOException() {         override val message: String             get() = "No network available, please check your WiFi or Data connection"     }      class NoInternetException : IOException() {         override val message: String             get() = "No internet available, please check your connected WIFi or Data"     } } 
</div
              

Список ответов

Связанный проблема

2  Как получить направление на кратчайший путь внешнего круга в Google Maps Android, когда мое текущее местоположение находится внутри 2 или более кругов?  ( How to get direction to the shortest path outside circle in google maps android ) 
Как получить направление к ближайшему расположению внешний круг, если голубые точки - текущее местоположение? 1 [ 1 и как отображать маркеры только во...

6  Android Gridlayout API 21  ( Android gridlayout api 21 ) 
Я пытаюсь сделать что-то вроде этого: В настоящее время я вручную устанавливаю ширину плиток, равных половине ширины экрана. Это работает хорошо, но он д...

9  Phone Gam [Ошибка] CMD: Команда не удалась с помощью выхода кода Enoent  ( Phone gap error cmd command failed with exit code enoent ) 
Я пытаюсь получить разрыв на телефоне работать на Android, и моя команда выводит следующее: <код> phonegap build android [phonegap] detecting Android SDK en...

0  Android-студия «Приложения имеют одинаковое имя пакета»  ( Android studio applications have the same package name ) 
Мое приложение в Android Studio имеет отдельные компоненты для мобильных устройств и для очков Google. Когда я пытаюсь загрузить мобильную версию на Nexus 10 ...

1  Первое приложение для Android после Eclipse Установить  ( First app for android after eclipse install ) 
Я искал вокруг и не могу найти точную ситуацию или ответить, что мне нужно, поэтому мне придется задать вопрос, что я уверен, что где-то просил там, поэтому м...

1  Проблема с использованием TextureView с NDK  ( Issue using textureview with ndk ) 
Я работаю над небольшим кусочком кода, используя текстуру, чтобы отобразить результат среды MediaPlayer. Я сталкиваюсь с проблемой, пытающимся смешивать упр...

4  Как получить местное видео URI для Exoplayer 2.x  ( How to get local video uri for exoplayer 2 x ) 
У меня есть видеофайл Dog.mp4 в res/raw папка, который я хочу играть с экзоплом. Я пытаюсь выяснить, как получить видео URI для этой строки кода из Руководс...

1  Обновить и загрузить один конкретный фрагмент предыдущего действия  ( Refresh and load one particular fragment of the previous activity ) 
У меня есть 3 фрагмента в активности. Один из фрагментов отображает список предметов вместе с ценой и количеством. При выборе любого элемента появится новое д...

-1  Как изменить странные и даже пункты меню переполнения меню  ( How to change odd and even overflow menu items background ) 
Как изменить странные и даже переполнить пункты меню фон в Android? ...

2  Держите текущую страницу, представленную, пока на следующей странице не загружена  ( Keep current page rendered until the next page is loaded ) 
У меня есть простое приложение, которое основано на WebView.loadurl (« http://www.example.com "). Когда пользователь нажимает на URL, поведение по умолчани...

6  Как использовать OnDateChangedListener, OnDatesetListener без использования DatePickerDialog?  ( How to use ondatechangedlistener ondatesetlistener without using datepickerdial ) 
Я хочу иметь возможность обнаруживать изменения в DatePicker, как только пользователь начинает менять его. Однако я не хочу использовать datrpickerdialog. Кто...

0  ONITEMSELUCTERLISTENER не выходит, когда я выбираю то же предыдущее значение  ( Onitemselectedlistener is not fired when i select the same previous value ) 
Когда я снова выбираю то же значение, которое в адаптере значения не обновляются и даже OnitEmseLectedListener или NothingsElected не выдержаны Вот следует ...

2  Как поставить один за один звонок на удержание? [закрыто]  ( How to put one by one call on hold ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

2  Распознавание речи Android не подключено к службе распознавания  ( Android speech recognizer not connected to the recognition service ) 
Я хочу ввести функцию постоянного распознавания голоса в моем приложении Android. Я осознаю тот факт, что распознавание голоса время от времени зависает от ...

25  Почему приложение умирает случайным образом?  ( Why application is dying randomly ) 
Я разрабатываю приложение для музыкального проигрывателя. Все работает нормально, за исключением внезапно умирает приложение. Иногда это происходит, когда при...

Связанный проблема

2  Как получить направление на кратчайший путь внешнего круга в Google Maps Android, когда мое текущее местоположение находится внутри 2 или более кругов? 
6  Android Gridlayout API 21 
9  Phone Gam [Ошибка] CMD: Команда не удалась с помощью выхода кода Enoent 
0  Android-студия «Приложения имеют одинаковое имя пакета» 
1  Первое приложение для Android после Eclipse Установить 
1  Проблема с использованием TextureView с NDK 
4  Как получить местное видео URI для Exoplayer 2.x 
1  Обновить и загрузить один конкретный фрагмент предыдущего действия 
-1  Как изменить странные и даже пункты меню переполнения меню 
2  Держите текущую страницу, представленную, пока на следующей странице не загружена 
6  Как использовать OnDateChangedListener, OnDatesetListener без использования DatePickerDialog? 
0  ONITEMSELUCTERLISTENER не выходит, когда я выбираю то же предыдущее значение 
2  Как поставить один за один звонок на удержание? [закрыто] 
2  Распознавание речи Android не подключено к службе распознавания 
25  Почему приложение умирает случайным образом?