簡體   English   中英

Android從Retrofit調用獲取LiveData

[英]Android get LiveData from Retrofit call

我正在嘗試在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
    }

}

正如@tyczj在評論中所說,每次使用LiveData時,您都必須確定何時所有觀察者都收到更新通知。

您可以通過調用paymentMethodListLiveData對象的post函數來進行此通知。 這是在Java中使用LiveData的正確方法。

Kotlin中,我認為您必須在onResponse方法上添加以下內容:

paymentMethodListLiveData.value = paymentMethodList;

在您的觀察函數中隱式調用post方法和觸發器方法。

希望此幫助或給您一些提示。

干杯

將您的請求更改為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
       })

我建議您將retrofit 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM