为了账号安全,请及时绑定邮箱和手机立即绑定

安卓从改造调用中获取实时数据

安卓从改造调用中获取实时数据

隔江千里 2022-09-22 16:07:59
我正在尝试在我的Android项目上使用改造获取一些数据,并在视图模型上更新此数据以及我在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()    }}
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

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


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与冠状图或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


查看完整回答
反对 回复 2022-09-22
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

每次使用LiveData时,您都必须决定何时所有观察者都收到更新通知。

您可以通过调用付款方法列表的过帐功能来执行此通知。这是在 Java 中使用实时数据的正确方法。

在 Kotlin 中,我认为您必须在 onResponse 方法中添加类似如下的内容:

paymentMethodListLiveData.value = paymentMethodList;

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

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

干杯


查看完整回答
反对 回复 2022-09-22
  • 2 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号