Android Kotlin Retrofit Catch Exception в случае невозможности подключения к URL / серверу, предотвращение сбоя приложения - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь перехватить retrofit / okhttp эту ошибку / исключение

java.net.ConnectException: Failed to connect to /192.168.1.52:80

, чтобы предотвратить сбой приложения, который может произойти, если URL-адрес недоступен. Тем не менее, я не могу найти способ сделать это

это код, в котором я объявляю модернизацию, перехватчик и т. Д. c.

private const val BASE_URL = "http://192.168.1.52/api/v1/"

interface ApiService {
    @GET("authenticate")
    suspend fun checkPhoneNumber(@Query("phone_number") type:String):
            UserProperty

//            Deferred<UserProperty>

    @POST("authenticate/register")
    fun registerUser(@Body UserRegister: UserRegisterProperty):
            Call<List<UserProperty>>

}

object objectApi {

    private val moshi = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()

    val interceptor = HttpLoggingInterceptor()


    val retrofitService: ApiService by lazy {

        val timeout:Long = 7000;

        val client = OkHttpClient
            .Builder()
            .addInterceptor(interceptor).connectTimeout(timeout,TimeUnit.MILLISECONDS).build()

        interceptor.apply { interceptor.level = HttpLoggingInterceptor.Level.BODY }

            var retrofit = Retrofit.Builder()
                .client(client)
                .addConverterFactory(MoshiConverterFactory.create(moshi))
                .addCallAdapterFactory(CoroutineCallAdapterFactory())
                .baseUrl(BASE_URL)
                .build()
            retrofit.create(ApiService::class.java)
            //code


    }

}

вот фрагмент кода, где Я выполняю вызов API

private fun getUserData(phone_number: String) {
        Log.d("Response","getUserData Run")

        coroutineScope.launch () {
            Log.d("Response","coroutine Run")
            var getPropertiesDeferred =  DolpaguApi.retrofitService.checkPhoneNumber(phone_number)
            try {
                var _result = getPropertiesDeferred
                _response = "Success: ${_result.id} User properties retrieved"

                Log.d("Response API","SUCCESS : ${_result.id}")

                //check status user
                if (_result.status.equals("Inactive")){
                    Log.d("Auth","New User Intent")
                    _intent= Intent(this@InputOTPActivity, NewUserActivity::class.java)
                    _intent.putExtra("phoneNumber",_phoneNumber)

                } else if(_result.status.equals("Active")){
                    Log.d("Auth","Main Menu Intent")
                    _intent= Intent(this@InputOTPActivity, MainMenuActivity::class.java)
                } else{
                    Log.d("Auth","Main Activity Intent")
                    _intent= Intent(this@InputOTPActivity, MainActivity::class.java)
                }

                moveToNextIntent()
            } catch (t:Throwable) {
                _response = "Failure: " + t.message

                Log.d("Response Fail","FAILURE : ${t.message}")

                auth.signOut()


            }

        }

    }

* ПРИМЕЧАНИЕ. Приложение работает нормально, если доступен URL-адрес / место назначения. но если адрес назначения / URL недоступен, приложение просто сканирует sh. Я хочу предотвратить сбой приложения. вместо этого я хочу показать ошибку / исключение для интерфейса

...