对 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
中报告了这一点
我有以下基地 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
中报告了这一点