android - Livedata观察者多次调用
问题描述
我正在使用 mvvm 和存储库模式。我有一个带有协程的 api 调用,并在单击按钮时返回 livedata 并观察实时数据片段。一次正常工作,但第二个按钮单击视图模型观察方法多次调用
我的 ViewModel 类
@HiltViewModel
class OrderViewModel @Inject constructor (
private val repository: OrderRepository
): ViewModel() {
fun addCourier(body: JsonObject) = repository.addCourierActivity(body)
}
我的存储库类
class OrderRepository @Inject constructor(
private val gpsApi: GpsApi)
{
private var job: Job? = null
val mutabLiveData = MutableLiveData<DefaultResponse>()
/*private val exceptionHandler = CoroutineExceptionHandler {coroutineContext, throwable ->
mutabLiveData.postValue(DefaultResponse(-1, throwable.message!!))
}*/
fun addCourierActivity(body: JsonObject) : LiveData<DefaultResponse> {
job = CoroutineScope(Dispatchers.IO).launch {
val response = gpsApi.addCourierActivity(body)
Log.e("erer" ,"Coroutine scop called")
if(response.isSuccessful) {
mutabLiveData.postValue(response.body())
} else {
mutabLiveData.postValue(DefaultResponse(1, "Error"))
}
}
return mutabLiveData
}
}
我的片段类
viewmodel.addCourier(body).observe(viewLifecycleOwner) {
Log.e("dfdfdf","Observing livedata")
Toast.makeText(requireContext(), it.message, Toast.LENGTH_LONG).show()
}
解决方案
结帐this question它几乎与您的问题相同。尝试将 Event 与事件观察器一起使用。基本上,它会向观察者发送一个一次性事件,该事件可以在您的场景中使用
推荐阅读
- react-native - Text.js 的这种变化是否会影响任何事情,是否有必要?
- php - 特定位置的 nginx 重写规则
- css - laravel 中的 Boostrap 粘性页脚
- python - 使用 df.to_excel (openpyxl) 从数据框写入时如何在 Excel 中增加行
- javascript - 为什么我不能在 index.js 中使用导出的路由
- cmake - Percona5.7 cmake 在 centos 7 上失败
- mysql - 如何为 wiki 家族建立数据库?
- java - Java - 如何测试 Catch 块?
- javascript - 来自 javascript 对象的方法始终未定义
- android - 根据 WHERE 条件从 Sqlite 中获取记录