java - Android 从 Retrofit 调用获取 LiveData

标签 java android kotlin retrofit android-livedata

我正在尝试在我的 Android 项目上使用 Retrofit 获取一些数据,并使用 LiveData 在 ViewModel 和我的 Activity 上更新此数据。

这是我的服务类别:

 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
    }

}

最佳答案

将您的请求更改为 View 模型

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



}

在您的 View ( Activity )中使用

//load
paymentMethodSelectionViewModel.getAllPayments();


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

我建议您使用带有coroutines或RXJAVA2的retrofit 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

关于java - Android 从 Retrofit 调用获取 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55523179/

相关文章:

java - 删除记录器名称的前 X 部分

java - 警告 Xamarin android - 未提供 -tsa 或 -tsacert 并且此 jar 没有时间戳

android, httpurl连接错误

Android - 用于处理 IllegalStateException : Cannot access database on the main thread 的 Kotlin 协程

android - 避免在 fragment 中多次传递参数

java - 我可以使用 pico 容器共享同一类的两个对象吗?

java - Tomcat 总是加载 conf/logging.properties 忽略 log4j 文件

java - SSL 问题 - TFS 的 Jenkins 从站连接问题

serialization - 无法在 Kotlin 中序列化对象单例

android - 与observeOn组合时RxJava的startsWith操作符被忽略