используйте withContext один раз на два.Оба работают, или - PullRequest
0 голосов
/ 18 июня 2019

Я должен выполнить http-запрос (Retrofit 2) в фоновом потоке.

подход № 1:

 suspend fun getTraidersList(): TransportResponse = withContext(Dispatchers.IO) {
            val traderMonitorRestClient = RestClientFactory.createRestClient(TraderMonitorRestClient::class.java)
            executeOperation { traderMonitorRestClient.getTraidersList() }
        }


  suspend private fun executeOperation(transportOperation: suspend () -> Response<*>): TransportResponse {
            try {
                val response: Response<*> = transportOperation()
                return onResponse(response)
            } catch (e: Throwable) {
                return onNetworkFailure(e)
            }
        }
}

Как вы можете видеть метод getTraidersList()это начало в фоновом потоке withContext(Dispatchers.IO).Но в методе executeOperation я не использую withContext(Dispatchers.IO).

Хорошо.Это нормально работает.

подход # 2:

Использование withContext(Dispatchers.IO) также в методе executeOperation

suspend fun getTraidersList(): TransportResponse = withContext(Dispatchers.IO) {
            val traderMonitorRestClient = RestClientFactory.createRestClient(TraderMonitorRestClient::class.java)
            executeOperation { traderMonitorRestClient.getTraidersList() }
}

 suspend private fun executeOperation(transportOperation: suspend () -> Response<*>): TransportResponse = withContext(Dispatchers.IO) {
            try {
                val response: Response<*> = transportOperation()
                onResponse(response)
            } catch (e: Throwable) {
                onNetworkFailure(e)
            }
}

Оба подхода работают.Но какой подход правильный?Может быть, оба подхода верны?

1 Ответ

1 голос
/ 18 июня 2019

Если вы собираетесь использовать метод executeOperation где-либо еще, его можно поместить в другой поток, но пока, в вашем случае, он не нужен.

Это также может работать, если вы хотите использовать метод executeOperation.

suspend fun getTraidersList(): TransportResponse {
            val traderMonitorRestClient = RestClientFactory.createRestClient(TraderMonitorRestClient::class.java)
            executeOperation { traderMonitorRestClient.getTraidersList() }
}

 suspend private fun executeOperation(transportOperation: suspend () -> Response<*>): TransportResponse = withContext(Dispatchers.IO) {
            try {
                val response: Response<*> = transportOperation()
                onResponse(response)
            } catch (e: Throwable) {
                onNetworkFailure(e)
            }
}
...