Android 从 Retrofit 调用中获取 LiveData



我正在尝试在我的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 个元素的列表,并且在进行 rest 调用并更新列表后不会调用此观察器方法。


编辑

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
    }
}

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

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
       })

我建议您使用带有Corutines或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

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

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

Kotlin 中,我认为您必须在 onResponse 方法中添加这样的东西:

paymentMethodListLiveData.value = paymentMethodList;

在观察函数中隐式调用 POST 方法和触发器方法。

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

干杯

最新更新