Android从Retrofit调用获取LiveData

时间:2019-04-04 18:58:48

标签: java android kotlin retrofit android-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
    }

}

2 个答案:

答案 0 :(得分:2)

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

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

科特林中,我认为您必须在onResponse方法上添加如下内容:

paymentMethodListLiveData.value = paymentMethodList;

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

希望获得帮助或给您一些提示。

欢呼

答案 1 :(得分:2)

将您的请求更改为viewmodel

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

我建议您将改造2与Corutines或RXJAVA2配合使用, 查看本教程

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