Oto, co już wiem:
Modernizacja ma funkcję enqueue i funkcję execute. Funkcja enqueue wykonuje inaczej (tła) wątku, a następnie zwraca odpowiedź za pomocą wywołania zwrotnego. Funkcja execute wykonuje wątek wywołania i zwraca odpowiedź bezpośrednio. enqueue można wywołać na wątku ui, gdy execute nie powinien być wywoływany na wątku UI.

Ale teraz się zastanawiam, która z poniższych dwóch opcji jest lepsza.

Zadzwoń enqueue W normalnej funkcji:

fun makeRequest() {
    getCall().enqueue(
        object : Callback<ResponseBody> {
            override fun onResponse(
                call: Call<ResponseBody>,
                response: Response<ResponseBody>
            ) {
                
                if (response.isSuccessful) {
                    //unsuccessful
                }
                //successful
            }
            
            override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                //failed
            }
            
        }
    )
}

Lub zadzwoń execute w funkcji zawieszenia na wątku tła:

suspend fun makeRequest() = withContext(Dispatchers.IO) {
    val call = getCall()
    
    try {
        val response = call.execute()
        
        if (!response.isSuccessful) {
            //unsuccessful
        }
        
        //successful
    } catch (t: Throwable) {
        //failed
    }
}

Który z nich jest lepszy?

1
AndroidKotlinNoob 5 październik 2020, 14:55

1 odpowiedź

Najlepsza odpowiedź

Coroutines mają czystszą składnię, więc to jest plus. A jeśli jesteś zaznajomiony z SuperorSjob Coroutine, możesz łatwiej anulować grupy żądań. Poza tym są w dużej mierze takie same, z wyjątkiem tego, dla którego wątku w tła jest używany do żądania. Ale Modernizacja ma już wbudowaną obsługę Coutaine, więc Twoja druga wersja może być czystsza niż to, co masz:

suspend fun makeRequest() { // Can be called from any dispatcher
    try {
        val response = getCall().awaitResponse()
        
        if (!response.isSuccessful) {
            //unsuccessful
        }
        
        //successful
    } catch (t: Throwable) {
        //failed
    }
}
3
Tenfour04 5 październik 2020, 13:21