Как сделать запрос с параметром с помощью Retrofit и сопрограмм - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в сопрограммах, и я пытаюсь понять, как сделать простой запрос с использованием модификации, где я могу передать свой собственный параметр. Все примеры, восхваляющие его простоту, используют либо жестко запрограммированный параметр запроса, либо вызовы, в которых они вообще не используются (например, https://proandroiddev.com/suspend-what-youre-doing-retrofit-has-now-coroutines-support-c65bd09ba067)

Мой сценарий следующий - фрагмент имеет текст редактирования, в который пользователь помещает данные, а также фрагменты наблюдают за MutableLiveData, определенным в ViewModel. При нажатии кнопки я хочу сделать запрос, используя значение из текста редактирования, и обновить MutableLiveData содержимым ответа. Это не звучит сложно, но я не могу найти способ сделать это с помощью сопрограмм.

1 Ответ

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

Представим, что у вас есть следующий интерфейс:

interface Webservice {
    @GET("/getrequest")
    suspend fun myRequest(@Query("queryParam1") String param1): Object
}

Внутри модели представления, которая у вас есть, вы можете определить метод, который будет выполнять вызов модификации внутри сопрограммы:

import androidx.lifecycle.Transformations
import kotlinx.coroutines.Dispatchers
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.LiveData

class YourViewModel {

    private val mutableLiveData = MutableLiveData<Object>()
    val liveData = Transformations.map(mutableLiveData) { object ->
            // return object or use it to calculate 
            // new result that will be returned by this liveData object
            // e.g. if object is a List<Int> you can sort it before returning
            object
        }

    companion object {
        // Just for the sake of explaining we init 
        // and store Webservice in ViewModel
        // But do not do this in your applications!!
        val webservice = Retrofit.Builder()
            .baseUrl(Constant.BASE_URL)
            .addConverterFactory(yourConverter)
            .build()
            .create(Webservice::class.java)
    }

    ...

    fun executeNetworkRequest(String text) {
        viewModelScope.launch(Dispatchers.IO) {
            val result = webservice.myRequest(text)

            withContext(Dispatchers.Main) {
                mutableLiveData.value = result
            }
        }
    }
}
...