gpt4 book ai didi

android - 仅在数据更改时调用 LiveData.observe() 回调并忽略 Controller (Activity/Fragment)的生命周期更改

转载 作者:行者123 更新时间:2023-11-30 05:01:43 32 4
gpt4 key购买 nike

我使用 LiveData 将错误消息发布到 Controller (Activity/Fragment)。

一旦设置了错误消息 (MutableLiveData.setValue(...)),错误消息的值就会被回调观察到 (MutableLiveData.observe(lifecycleOwner, callback)) 在 Snackbar UI 组件中显示消息。

Snackbar 按照设计只在短时间内可见,这很好。 Snackbar 隐藏后,我想保持这种状态。

然而,在用户旋转显示后, Controller (Activity/Fragment) 被重新创建并再次通知观察者 - 因此 Snackbar 再次出现,这不是我想要的。

问题:我以某种方式修复了 if(!isActivityRecreated()) { showSnackbar(...); },但我想知道是否有一种方法可以告诉 MutableLiveData 实例应该只在数据发生变化时调用观察者,从而忽略 Controller 的生命周期变化?

(编辑)

@nik 的回答: https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150

跟进讨论: https://proandroiddev.com/livedata-with-single-events-2395dea972a8

“LiveEvent”库:这是作者在第一个链接中建议的 SingleLiveEvent 的综合实现:https://github.com/hadilq/LiveEvent .与其他解决方案相比,此实现似乎非常稳健。支持多个订阅并且是线程安全的。

最佳答案

正如@Michal Vician 在评论中提到的,我只是让答案更清楚。您应该像下面这样扩展 MutableLiveData。

public class SingleLiveEvent<T> extends MutableLiveData<T> {

private static final String TAG = "SingleLiveEvent";

private final AtomicBoolean mPending = new AtomicBoolean(false);

@MainThread
public void observe(LifecycleOwner owner, final Observer<T> observer) {

if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.");
}

// Observe the internal MutableLiveData
super.observe(owner, new Observer<T>() {
@Override
public void onChanged(@Nullable T t) {
if (mPending.compareAndSet(true, false)) {
observer.onChanged(t);
}
}
});
}

@MainThread
public void setValue(@Nullable T t) {
mPending.set(true);
super.setValue(t);
}

/**
* Used for cases where T is Void, to make calls cleaner.
*/
@MainThread
public void call() {
setValue(null);
}

}

refer link is here

关于android - 仅在数据更改时调用 LiveData.observe() 回调并忽略 Controller (Activity/Fragment)的生命周期更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58132057/

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