Перехватчик OkHttp продолжает возвращать ноль и вылетает приложение - PullRequest
0 голосов
/ 22 января 2019

У меня есть клиент OkHttp, который использует мой пользовательский сетевой перехватчик для вставки токена в заголовок запроса.

Я продолжаю получать исключение

E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 
   Process: com.edstart.tazuzu, PID: 32093
   java.lang.NullPointerException: interceptor com.edstart.tazuzu.RestAPI.RequestsErrorInterceptor@2bde70f returned null
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:157)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
       at com.edstart.tazuzu.RestAPI.TazuzuRequestsInterceptor.intercept(TazuzuRequestsInterceptor.kt:30)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
       at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
       at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
       at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
       at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
       at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:254)
       at okhttp3.RealCall$AsyncCall.execute(RealCall.java:200)
       at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
       at java.lang.Thread.run(Thread.java:764)

Я пытался окружить перехватчикс попыткой / ловить.а также выдает ошибку, чтобы избежать сбоя приложения, но безрезультатно.

Код перехватчика:

package com.edstart.tazuzu.RestAPI

import android.util.Log
import com.edstart.tazuzu.Managers.ServerManager
import okhttp3.Interceptor
import okhttp3.Response
import java.net.InetAddress
import kotlin.Exception

/**
 * interceptor for the tazuzu api requests to insert the token before the request
 * send to the server (for authentication)
 */
class TazuzuRequestsInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain?): Response? {
        try {

            if (!isInternetAvailable()) {
                throw Exception()
            } else {
                var request = chain?.request()

                if (request != null) {
                    val builder = request.newBuilder()
                    if (builder != null) {
                        builder.addHeader("x-access-token", ServerManager.token)

                        request = builder.build()
                        if (request != null && chain != null) {
                            return chain.proceed(request)
                        }
                    }
                }
            }
        } catch (e: java.lang.Exception) {
            Log.e("###", e.toString())
            throw e
        }
        return null
    }

    private fun isInternetAvailable(): Boolean {
        return try {
            val ipAddr = InetAddress.getByName("google.com")
            //You can replace it with your name
            !ipAddr.equals("")

        } catch (e: Exception) {
            false
        }

    }

Пожалуйста, помогите, ищите способы управления исключениями так, как это не будетвылетает приложение.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Несколько нот

Вы не должны передавать null в перехватчик

Что пошло не так

Нульпередается в нисходящую цепочку

Что вы можете сделать

class ErrorHandlingInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val response = chain.proceed(request)

        if (!isInternetAvailable()) {
            // Do your thing
            // 1. Either throw a generic exception
            // 2. Throw an exception with your own custom status code that can be checked on the callbacks
            // 3. Create an interface callback

            // example throw invocation
            throw Exception()
        } else {
            val builder = request.newBuilder()
            builder?.let { builder ->
                builder.addHeader("x-access-token", ServerManager.token)
            }
            request = builder.build()

            // No need for this additional checks
            // if (request != null && chain != null) { ... }

            return chain.proceed(request)
        }
    }
}


private fun isInternetAvailable(): Boolean {
    return try {
        val ipAddr = InetAddress.getByName("google.com")
        //You can replace it with your name
        !ipAddr.equals("")

    } catch (e: Exception) {
        false
    }

}

Если, например, вы решили выбросить исключение при отсутствии подключения к Интернету, вы можетепросто обрабатывать все в onFailure() обратном вызове retrofit вызова.

Или, если вы используете rxjava, вы можете просто подписаться на ошибку в обработчике обратного вызова с ошибкой.

Подробнее о

0 голосов
/ 22 января 2019

Вы не должны возвращать null в методе intercept. Верните что-то вроде этого:

override fun intercept(chain: Interceptor.Chain?): Response? {
    // ...
    return chain?.proceed(request);
}
...