Есть несколько способов достичь этой цели.Ниже приведены два примера:
Добавление таймаута с помощью HttpURLConnection
:
try {
connection.connectTimeout = 5000 // We all timeout here
connection.connect()
text = connection.inputStream.use { it.reader().use{reader -> reader.readText()} }
} finally{
connection.disconnect()
}
Отключение вручную с помощью Handler
& Runnable
(Мы можем добиться того же самого, используя CountDownTimer или любой другой материал) :
try {
connection.connect()
text = connection.inputStream.use { it.reader().use{reader -> reader.readText()} }
// We all timeout here using Handler
Handler().postDelayed(
{
connection.disconnect() // We disconnect manually
},
5000 // Timeout value
)
} finally{
connection.disconnect()
}
Редактировать для OP:
Используйте приведенный ниже класс для совершения вызова API и отображения предупреждения для пользователя , если время соединения истекло .
//We pass context to Activity/Fragment to display alert dialog
inner class TestApiCall(private val context: Context?) : AsyncTask<String, String, String?>() {
// for build connection
override fun doInBackground(vararg url: String?): String? {
var text: String? = null
val connection = URL(url[0]).openConnection() as HttpURLConnection
try {
connection.connect()
text = connection.inputStream.use { it.reader().use { reader -> reader.readText() } }
handleTimeout { timedOut ->
if (timedOut) {
text = null
connection.disconnect()
print("Timeout Executed")
}
}
} finally {
connection.disconnect()
}
return text
}
private fun handleTimeout(delay: Long = 5000, timeout: (Boolean) -> Unit) {
Handler(Looper.getMainLooper()).postDelayed({
timeout(true)
}, delay)
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
if (result != null) {
//Handle result here
print("Result --> $result")
} else {
//Result is null meaning it can be timed out
context?.let { ctx ->
val alertDialog = AlertDialog.Builder(ctx)
alertDialog.setTitle("Some title here")
alertDialog.setMessage("Notifying user about API error")
alertDialog.create().show()
}
}
}
override fun onProgressUpdate(vararg text: String?) {
//Update progress from here
}
}
Вызовите его с Activity/Fragment
, передав context и "URL вашего API" :
TestApiCall(context).execute("https://jsonplaceholder.typicode.com/todos/1")