首页 > 解决方案 > 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()
    }

标签: androidandroid-livedataandroid-mvvm

解决方案


结帐this question它几乎与您的问题相同。尝试将 Event 与事件观察器一起使用。基本上,它会向观察者发送一个一次性事件,该事件可以在您的场景中使用


推荐阅读