Got this error with retrofit2 & OkHttp3. Unable to resolve host “”: No address associated with hostname

前端 未结 4 2056
南笙
南笙 2021-02-12 11:22

I am using the retrofit 2 and OkHttp3 to request data from server. I just added a offline cache code but It\'s not working as expected. I got the error \"Unable to resolve host

相关标签:
4条回答
  • 2021-02-12 11:37

    This happens when trying to access a hostname that is not available on the connected network. Check whether or not you can access this URL through the web browser of the device. If not: There is your problem.

    0 讨论(0)
  • 2021-02-12 11:45

    I had the same error in my project with kotlin, and I fixed it like this:

    client.addInterceptor(provideOfflineCacheInterceptor(context))
    client.addNetworkInterceptor(provideCacheInterceptor(context))
    
    private fun provideOfflineCacheInterceptor(context: Context): Interceptor {
            return Interceptor { chain ->
                var request = chain.request()
                var cacheHeaderValue = if (!hasNetwork(context)!!){
                        "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 1
                    } else {
                        "public, max-age=" + 5
                    }
                request = request.newBuilder().header("Cache-Control", cacheHeaderValue).build()
                chain.proceed(request)
            }
        }
    
        private fun provideCacheInterceptor(context: Context): Interceptor {
            return Interceptor { chain ->
                val request = chain.request()
                var cacheHeaderValue = if (!hasNetwork(context)!!){
                        "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 1
                    } else {
                        "public, max-age=" + 5
                    }
                //request = request.newBuilder().build()
                val response = chain.proceed(request)
                response.newBuilder()
                        .removeHeader("Pragma")
                        .removeHeader("Cache-Control")
                        .header("Cache-Control", cacheHeaderValue)
                        .build()
            }
        }
    
    0 讨论(0)
  • 2021-02-12 11:46

    Please check your network "turn ON" in Manifest file permission OFF Airplane mode on Emulator

    0 讨论(0)
  • 2021-02-12 11:59

    Your server response has a "Pragma: no-cache" header. You should remove this header in your response interceptor not your request interceptor.

    In your current code you've removed it from the request interceptor.

    Your provideCacheInterceptor() should look like this:

    public static Interceptor provideCacheInterceptor() {
        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Response response = chain.proceed(chain.request());
    
                // re-write response header to force use of cache
                CacheControl cacheControl = new CacheControl.Builder()
                       .maxAge(2, TimeUnit.MINUTES)
                       .build();
    
               return response.newBuilder()
                        .header(CACHE_CONTROL, cacheControl.toString())
                        .removeHeader("Pragma")
                        .build();
            }
        };
    }
    
    0 讨论(0)
提交回复
热议问题