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



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

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>
}

LoginViewModel: my viewModel 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()
        }
    }
}

你必须把这个类添加到OkHttpBuider:

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

相关内容

最新更新