对 LiveData 使用 setValue 而不是 PostValue

Using setValue instead of PostValue for LiveData

我有以下基地 class :

open class BaseViewModel<T>(
private val schedulerProvider: BaseSchedulerProvider,
private val requestObservable: Observable<T>
) : ViewModel() {

   private val compositeDisposable = CompositeDisposable()

   private val _liveData = MutableLiveData<Resource<T>>()
   val liveData: LiveData<Resource<T>>
      get() = _liveData

   protected fun sendRequest() {
       _liveData.postValue(Resource.Loading)
       composeObservable { requestObservable }.subscribe({
           _liveData.postValue(Resource.Success(it))
       }) {
           _liveData.postValue(Resource.Failure(it.localizedMessage))
           Timber.e(it)
       }.also { compositeDisposable.add(it) }
   }
}

在我派生的 classes 之一中,我有以下逻辑:

class DetailViewModel(api: QapitalService, schedulerProvider: BaseSchedulerProvider,
        currencyFormatter: CurrencyFormatterDefault, goal: SavingsGoal
    ) : BaseViewModel<DetailWrapper>(schedulerProvider,
        Observable.zip(api.requestFeeds(goal.id).map { it.wrapper },
            api.requestSavingRules().map { it.wrapper },
            BiFunction<List<Feed>, List<SavingsRule>, DetailWrapper>
            { feeds, savingRules -> DetailWrapper(feeds,
                savingRules.joinToString { it.type },
                feeds.asWeekSumText(currencyFormatter)
            ) })) {

    init {
        sendRequest()
    }

    class DetailWrapper(
        val feeds: List<Feed>,
        val savingRules: String,
        val weekSumText: String)
}

正如您在 sendRequest() 方法中看到的,我有 postValue(Loading)。我相信它在主线程上,不需要 PostValue 而我可以 setValue.

但是通过使用 setValue 当我点击 Home hardware 按钮并再次恢复应用程序时,ProgressBar 再次出现。为什么会这样?

当我使用 PostValue 时,我恢复应用程序时没有出现进度条。

我做了一些其他类似的项目,但我没有遇到上面解释的问题,但这些项目是单个 Activity 和使用导航组件的多个片段。在上面的项目中,我有多个带有多个片段的活动,这些片段被附加到活动布局。

可以找到完整的源代码:https://github.com/AliRezaeiii/SavingGoals-Cache

这是我 fragment_detail 布局中的进度条:

<ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            app:showLoading="@{vm.liveData}" />

这里是 showLoading 绑定适配器:

@BindingAdapter("showLoading")
    fun showLoading(view: ProgressBar, resource: Resource<*>?) {
        view.visibility = if (resource is Resource.Loading) View.VISIBLE else View.GONE
    }

我刚刚使用导航组件使用单个 Activity 和多个片段升级了我的项目,我在问题中解释的问题已解决。

正如我所提到的,我使用了具有多个片段的多个活动,因此我在 Google issue tracker

中报告了这一点