【问题标题】:Android get LiveData from Retrofit callAndroid 从 Retrofit 调用中获取 LiveData
【发布时间】:2019-08-26 15:17:01
【问题描述】:

我正在尝试在我的 Android 项目中使用 Retrofit 获取一些数据,在 ViewModel 上更新这些数据,并使用 LiveData 获取我的活动。

这是我的服务类:

 class PaymentService {

        private var paymentMethodList = ArrayList<PaymentMethodModel>()
        private val paymentMethodListLiveData = MutableLiveData<List<PaymentMethodModel>>()

        init {
            paymentMethodListLiveData.value = paymentMethodList
        }

        fun fetchPaymentMethods() {
            val retrofit = Retrofit.Builder()
                .baseUrl(SERVICE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build()

            val service = retrofit.create(PaymentClient::class.java)
            val jsonCall = service.getListOfPaymentMethods()
            jsonCall.enqueue(object : Callback<List<PaymentMethodModel>> {
                override fun onResponse(call: Call<List<PaymentMethodModel>>, response: Response<List<PaymentMethodModel>>) {
                    paymentMethodList = (response.body() as ArrayList<PaymentMethodModel>?)!!
                }

                override fun onFailure(call: Call<List<PaymentMethodModel>>, t: Throwable) {
                    //TODO
                }
            })
        }

这里是我尝试聆听列表中的变化的地方:

goToNextButton.setOnClickListener {

            paymentMethods = PaymentMethodSelectionViewModel().getAllPaymentMethods()
            paymentMethods!!.observe(viewLifecycleOwner, Observer {
                Log.e("", "")
            })
        }

问题是,到目前为止,我只在第一次使用 0 个元素时获取列表,并且在进行其余调用并更新列表后,没有调用此观察者方法。


编辑

class PaymentRepository {

    private val paymentService = PaymentService()

    fun getPaymentMethods(): LiveData<List<PaymentMethodModel>> {
        paymentService.fetchPaymentMethods()
        return paymentService.getPaymentMethods()
    }

}


class PaymentMethodSelectionViewModel: ViewModel() {

    private val paymentRepository = PaymentRepository()
    private val paymentMethods = paymentRepository.getPaymentMethods()

    fun getAllPaymentMethods(): LiveData<List<PaymentMethodModel>> {
        paymentRepository.getPaymentMethods()
        return paymentMethods
    }

}

【问题讨论】:

  • 您不会将值发布到响应块中的实时数据
  • 你能展示你的视图模型吗?
  • 我在编辑中添加了更多类,到目前为止他们只是传递参考,这有点令人费解,但我正在尝试练习和学习 MVVM

标签: java android kotlin retrofit android-livedata


【解决方案1】:

将您的请求更改为视图模型

class PaymentMethodSelectionViewModel: ViewModel() {

    //Data
    var paymentMethodList =  MutableLiveData<List<PaymentMethodModel>>()

    fun getAllPayments(){

        val retrofit = Retrofit.Builder()
            .baseUrl(SERVICE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        val service = retrofit.create(PaymentClient::class.java)
        val jsonCall = service.getListOfPaymentMethods()

        jsonCall.enqueue(object : Callback<List<PaymentMethodModel>> {
            override fun onResponse(call: Call<List<PaymentMethodModel>>, response: Response<List<PaymentMethodModel>>) {

                var data: List<PaymentMethodModel>  = (response.body() as ArrayList<PaymentMethodModel>?)!!

               paymentMethodList.value=data


            }

            override fun onFailure(call: Call<List<PaymentMethodModel>>, t: Throwable) {
                //TODO
            }
        })
    }



}

在您的视图(活动)中使用

//load
paymentMethodSelectionViewModel.getAllPayments();


//Observers
 paymentMethodSelectionViewModel.paymentMethodList.observe(this,
   Observer { list ->
           // your code
       })

我建议您使用带有协程或 RXJAVA2 的改造 2, 查看本教程

https://medium.com/@amtechnovation/android-architecture-component-mvvm-part-1-a2e7cff07a76

https://medium.com/@saquib3705/consuming-rest-api-using-retrofit-library-with-the-help-of-mvvm-dagger-livedata-and-rxjava2-in-67aebefe031d

【讨论】:

    【解决方案2】:

    正如@tyczj 在评论中所说,每次使用 LiveData 时,都必须决定所有观察者何时收到更新通知。

    您可以通过调用您的 paymentMethodListLiveData 对象的 post 函数来进行此通知。这是在 Java 中使用 LiveData 的正确方法。

    Kotlin 中,我认为您必须在 onResponse 方法中添加类似这样的内容:

    paymentMethodListLiveData.value = paymentMethodList;
    

    在你的观察函数中隐式调用 post 方法和 trigger 方法。

    希望对您有所帮助或给您一些提示。

    干杯

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2018-03-30
      相关资源
      最近更新 更多