Получить значение не единицу в блоке try catch в Kotlin с помощью Android - PullRequest
0 голосов
/ 28 октября 2019

Модификация Android kotlin сопрограммы.

Я хочу получить значение из getPropeties, чтобы вставить его в базу данных. Мне нужна помощь для этого? Мне нужно, чтобы значение было экземпляром User, а не значением единицы. Мой класс viewModel приведен ниже.

    import android.app.Application
    import android.content.Context
    import android.util.Log
    import androidx.lifecycle.LiveData
    import androidx.lifecycle.MutableLiveData
    import androidx.lifecycle.ViewModel
    import com.example.android.marsrealestate.database.AppDatabase
    import com.example.android.marsrealestate.database.User
    import com.example.android.marsrealestate.database.UserDao
    import com.example.android.marsrealestate.network.UsersApi
    import com.example.android.marsrealestate.network.UsersProperty
    import kotlinx.coroutines.*
    import retrofit2.Call
    import retrofit2.Callback
    import retrofit2.Response


    class OverviewViewModel(val database: UserDao,
                            application: Application): ViewModel() {
        private var viewModelJob = Job()
        private val coroutineScope = CoroutineScope(
                viewModelJob + Dispatchers.Main )
        private var user = MutableLiveData<User?>()
        // The internal MutableLiveData String that stores the most recent response
        private val _response = MutableLiveData<String>()

        // The external immutable LiveData for the response String
        val response: LiveData<String>
            get() = _response

        init {
            getUsersProperties()

        }

        private fun getUsersProperties(){
            coroutineScope.launch {
                var getPropertiesDeferred =
                        UsersApi.retrofitService.getProperties()
                try {
                    var listResult = getPropertiesDeferred.await()
                    //database.insertUser(listResult)
                    _response.value =
                            "Success: ${listResult} Mars properties retrieved"

                } catch (e: Exception) {
                    _response.value = "Failure: ${e.message}"
                }
            }
        }

        override fun onCleared() {
            super.onCleared()
            viewModelJob.cancel()
        }
    }

Спасибо

1 Ответ

0 голосов
/ 29 октября 2019

Вы используете launch,

Launch используется для выполнения асинхронного огня и забывает тип операций, в которых вы не заинтересованы в результате операции.

Вместо этого вы можете использовать async,

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

private fun getUsersProperties() =
            coroutineScope.async {
                var getPropertiesDeferred =
                        UsersApi.retrofitService.getProperties()
                try {
                    var listResult = getPropertiesDeferred.await()
                    //database.insertUser(listResult)
                    _response.value =
                            "Success: ${listResult} Mars properties retrieved"

                } catch (e: Exception) {
                    _response.value = "Failure: ${e.message}"
                }
              // =================================================
              // ========= Return whatever result you want =======
              // =================================================
            }

canвы также показываете, что такое тип подписи getProperties?

...