gpt4 book ai didi

android - 在 Android 的 onClickListener 中多次观察到 LiveData

转载 作者:行者123 更新时间:2023-12-02 04:25:06 25 4
gpt4 key购买 nike

我有这样的存储库设置

class ServerTimeRepo @Inject constructor(private val retrofit: Retrofit){
var liveDataTime = MutableLiveData<TimeResponse>()
fun getServerTime(): LiveData<TimeResponse> {
val serverTimeService:ServerTimeService = retrofit.create(ServerTimeService::class.java)
val obs = serverTimeService.getServerTime()
obs.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).unsubscribeOn(Schedulers.io())
.subscribe(object : Observer<Response<TimeResponse>> {
override fun onComplete() {

}

override fun onSubscribe(d: Disposable) {

}

override fun onNext(t: Response<TimeResponse>) {
val gson = Gson()
val json: String?
val code = t.code()
val cs = code.toString()
if (!cs.equals("200")) {
json = t.errorBody()!!.string()
val userError = gson.fromJson(json, Error::class.java)
} else {

liveDataTime.value = t.body()
}

}

override fun onError(e: Throwable) {

}

})
return liveDataTime
}
}

然后我有一个 viewmodel 像这样调用这个 repo
class ServerTimeViewModel @Inject constructor(private val serverTimeRepo: ServerTimeRepo):ViewModel() {

fun getServerTime(): LiveData<TimeResponse> {
return serverTimeRepo.getServerTime()
}
}

然后我有一个 Activity ,我有一个 onClickListener 来观察实时数据,就像这样
tvPWStart.setOnClickListener {
val stlv= serverTimeViewModel.getServerTime()

stlv.observe(this@HomeScreenActivity, Observer {
//this is getting called multiple times??

})
}

我不知道这有什么问题。谁能指出我正确的方向?谢谢。

最佳答案

问题是每次您的点击监听 被解雇,你观察到 LiveData一次又一次。因此,您可以通过以下解决方案解决该问题:

  • 拍下MutableLiveData ViewModel 中的对象私下观察它为LiveData .
    class ServerTimeViewModel @Inject constructor(private val serverTimeRepo: ServerTimeRepo):ViewModel() {

    private val serverTimeData = MutableLiveData<TimeResponse>() // We make private variable so that UI/View can't modify directly

    fun getServerTime() {
    serverTimeData.value = serverTimeRepo.getServerTime().value // Rather than returning LiveData, we set value to our local MutableLiveData
    }

    fun observeServerTime(): LiveData<TimeResponse> {
    return serverTimeData //Here we expose our MutableLiveData as LiveData to avoid modification from UI/View
    }
    }
  • 现在,我们观察到这个 LiveData直接在 ClickListener 之外我们只需从按钮单击调用 API 方法,如下所示:
    //Assuming that this code is inside onCreate() of your Activity/Fragment
    //first we observe our LiveData
    serverTimeViewModel.observeServerTime().observe(this@HomeScreenActivity, Observer {
    //In such case, we won't observe multiple LiveData but one
    })
    //Then during our ClickListener, we just do API method call without any callback.
    tvPWStart.setOnClickListener {
    serverTimeViewModel.getServerTime()
    }
  • 关于android - 在 Android 的 onClickListener 中多次观察到 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55340449/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com