ViewModel 极大的方便了我们的开发,但是 activity被回收在重新创建,由于VIewModel的生命周期机制,Obser的回调会被多次执行,显而易见不是我们想看到的,但是站在巨人的肩膀上,处理方式也很简单,使用谷歌大神的方案,SingleLiveEvent 代替 MutableLiveData即可。SingleLiveEvent 具体代码:

public class SingleLiveEvent<T> extends MutableLiveData<T> {
    private final AtomicBoolean mPending = new AtomicBoolean(false);
    @Override
    public void observe(@NonNull LifecycleOwner owner, @NonNull final Observer<? super T> observer) {
        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);
    }
}

 

主要思想是定义一个标记, 在setvalue 时 设置标记 为true,监听变化回调时,置为flase,这样 回调监听 只会在setvalue时触发,具体思想参考SingleLiveEvent。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐