Как отличить исключение, генерируемое в случае отсутствия соединения inte rnet, от случая, когда сервер недоступен / или неверный URL? - PullRequest
0 голосов
/ 15 января 2020

У меня есть when(kotlin) / switch case(java), который получает java.net исключений для моих запросов. Проблема в том, что он выдает UnknownHostException для двух случаев:

  1. Когда у меня нет соединения.

  2. Когда я вставляю неверный URL ( это будет эквивалентно тому, что сервер будет полностью недоступен).

Как можно дифференцировать эти два случая, если они выдают одно и то же исключение? Должен ли я проверять подключение пользователя перед каждым запросом?

когда / попробуй поймать

            is SocketTimeoutException -> {
                 //Server takes too long to respond
            }
            is UnknownHostException -> {
                 //No connection and broken url / no server at all
            }
            is HttpException -> {
                 //server error response
            }
            else -> {
                 //Any other case
            }

Ответы [ 2 ]

1 голос
/ 22 января 2020

вам нужно создать Исключение, такое как Перехватчик, в вас OkHttpClient:
в OkHttpClient: .addInterceptor (ConnectivityInterceptor (context)) *


class ConnectivityInterceptor(private val mContext: Context) : Interceptor {
    @Throws(IOException::class)
    override fun intercept(chain: Chain): Response {
        if (!NetworkUtil.isOnline(mContext)) {
            throw NoInternet()
        }
        val builder = chain.request().newBuilder()
        return chain.proceed(builder.build())
    }

}


class NoInternet : IOException() {

    override val message: String?
        get() {
            return "No connectivity exception"
        }

}

class NetworkUtil {
    companion object {
        fun isOnline(context: Context): Boolean {
            var result = false
            val connectivityManager =
                context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val networkCapabilities = connectivityManager.activeNetwork ?: return false
                val actNw =
                    connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
                result = when {
                    actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
                    actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
                    actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
                    else -> false
                }
            } else {
                connectivityManager.run {
                    connectivityManager.activeNetworkInfo?.run {
                        result = when (type) {
                            ConnectivityManager.TYPE_WIFI -> true
                            ConnectivityManager.TYPE_MOBILE -> true
                            ConnectivityManager.TYPE_ETHERNET -> true
                            else -> false
                        }
                    }
                }
            }
            return result
        }
    }
}

, и вы используете, когда

       is NoInternet -> {
}
0 голосов
/ 16 января 2020

После некоторого поиска в Google и просмотра некоторых статей я думаю, что лучший способ сделать это правильно - проверить, подключен ли клиент к inte rnet.

Метод 1

public static boolean isNetworkAvailable (Context context) {  
    if (connectedToTheNetwork(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) 
                (new URL("http://clients3.google.com/generate_204")
                .openConnection());
            urlc.setRequestProperty("User-Agent", "Android");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 204 &&
                        urlc.getContentLength() == 0);
        } catch (IOException e) {
            Log.e(TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(TAG, "No network available!");
    }
    return false;
}

Источник

Метод 2

 fun verifyAvailableNetwork(activity:AppCompatActivity):Boolean{
      val connectivityManager=activity.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
      val networkInfo=connectivityManager.activeNetworkInfo
      return  networkInfo!=null && networkInfo.isConnected
}

Источник

Метод 3

val Context.isConnected: Boolean
    get() {
        return (getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
           .activeNetworkInfo?.isConnected == true
    }

Источник

Я не проверял их, но все они имеют смысл, и, честно говоря, я бы начал с 3-го до 1-го. Чем проще, тем лучше.

Надеюсь, все получится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...