有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android从改造调用中获取实时数据

我正在尝试通过改造我的Android项目来获取一些数据,在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调用并更新列表后,不会调用此observer方法


编辑

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) 个答案

  1. # 1 楼答案

    将您的请求更改为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
           })
    

    我建议您使用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

  2. # 2 楼答案

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

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

    Kotlin中,我认为您必须在onResponse方法中添加以下内容:

    paymentMethodListLiveData.value = paymentMethodList;
    

    隐式调用observe函数中的post方法和触发器方法

    希望这能给你一些帮助或提示

    干杯