我正在使用 Retrofit 2.0。我想处理所有类型的网络错误和异常

I am using Retrofit 2.0. I want to handle all types of network errors and exceptions

我的应用程序在没有互联网连接时崩溃:我正在寻找一种方法来处理改造实例中的任何异常,例如未找到服务器异常超时无互联网连接

RequestRepository :我的存储库,其中包含我的所有功能

class RequestRepository {
    /** suspend function to get the result of token request*/
    suspend fun getToken(userLoginModel: UserLoginModel): Response<TokenResponse> {
        return ApiService.APILogin.getToken(userLoginModel)
    }

ApiService:包含我的 Retofit 实例

object ApiService {
    private var token: String = ""
    fun setToken(tk: String) {
        token = tk
    }

private val okHttpClient = OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS)
    .readTimeout(20, TimeUnit.SECONDS).addInterceptor { chain ->
        val chainRequest = chain.request()
        val requestBuilder = chainRequest.newBuilder()
            .addHeader("authorization", "Token $token")
            .method(chainRequest.method, chainRequest.body)
        val request = requestBuilder.build()
        chain.proceed(request)
    }.build()

var gson = GsonBuilder()
    .setLenient()
    .create()
private val retrofit by lazy {
    Retrofit.Builder()
        .baseUrl(LOGIN_URL)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .client(okHttpClient)
        .build()
}

val API: WebServicesApi by lazy {
    retrofit.create(WebServicesApi::class.java)

}

WebServicesApi:包含我的请求的我的界面

interface WebServicesApi {

    /** get the token from the API*/
    @POST("user/login/")
    suspend fun getToken(@Body userLoginModel: UserLoginModel): Response<TokenResponse>
}

登录视图模型:我的视图模型class

class LoginViewModel(private val repository: RequestRepository) : ViewModel() {
    var tokenResponse: MutableLiveData<Response<TokenResponse>> = MutableLiveData()


    /** using coroutine in getToken function to get the token   */
    fun getToken(userLoginModel: UserLoginModel) {
        viewModelScope.launch(Dispatchers.IO) {
            val tResponse = repository.getToken(userLoginModel)
            tokenResponse.postValue(tResponse)
            Log.d(TAG, "getToken: ${userLoginModel.password}")

        }

    }


}

您可以添加一个 Interceptor 来处理这样的错误:

class GlobalErrorInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        try {
            val response = chain.proceed(request)
            if (!response.isSuccessful) {
                val statusCode = response.code
                when (statusCode) {
                    //Your handle status code in here
                }
            }
            return response
        } catch (ex: IOException) {
           // You can replace my code with your exception handler code
            return Response.Builder().request(chain.request()).protocol(Protocol.HTTP_1_1)
                .message("Can't connect!").code(500).body(
                    ResponseBody.create(
                        "application/json; charset=utf-8".toMediaTypeOrNull(),
                        ""
                    )
                ).build()
        }
    }
}

并且您必须将此 class 添加到 OkHttpBuider:

 val httpBuilder = OkHttpClient.Builder()
 ......
 httpBuilder.addInterceptor(GlobalErrorInterceptor())