LiveData多次加载数据问题
楼主遇到一个情况,就是第一次进入页面监听livedata更新数据正常,返回重新进入页面后会更新两次数据,第一次更新的数据是上一次缓存的数据,第二次才是自己需要的数据,这样就会造成页面重复刷新的问题以及浪费资源,解决方法如下
就是使用一个谷歌大神实现的一个复写类 SingleLiveEvent代替livadata,其中的机制是用一个原子 AtomicBoolean记录一次setValue。在发送一次后在将AtomicBoolean设置为false,阻止后续前台重新触发时的数据发送。
-
/*
-
* Copyright 2017 Google Inc.
-
*
-
* Licensed under the Apache License, Version 2.0 (the "License");
-
* you may not use this file except in compliance with the License.
-
* You may obtain a copy of the License at
-
*
-
* http://www.apache.org/licenses/LICENSE-2.0
-
*
-
* Unless required by applicable law or agreed to in writing, software
-
* distributed under the License is distributed on an "AS IS" BASIS,
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
* See the License for the specific language governing permissions and
-
* limitations under the License.
-
*/
-
-
package com.dhc.jmpos.bus.event;
-
-
import android.util.Log;
-
-
import java.util.concurrent.atomic.AtomicBoolean;
-
-
import androidx.annotation.MainThread;
-
import androidx.annotation.Nullable;
-
import androidx.lifecycle.LifecycleOwner;
-
import androidx.lifecycle.MutableLiveData;
-
import androidx.lifecycle.Observer;
-
-
/**
-
* A lifecycle-aware observable that sends only new updates after subscription, used for events like
-
* navigation and Snackbar messages.
-
* <p>
-
* This avoids a common problem with events: on configuration change (like rotation) an update
-
* can be emitted if the observer is active. This LiveData only calls the observable if there's an
-
* explicit call to setValue() or call().
-
* <p>
-
* Note that only one observer is going to be notified of changes.
-
*/
-
public class SingleLiveEvent<T> extends MutableLiveData<T> {
-
-
private static final String TAG = "SingleLiveEvent";
-
-
private final AtomicBoolean mPending = new AtomicBoolean(false);
-
-
-
public void observe(LifecycleOwner owner, final Observer<? super 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>() {
-
-
public void onChanged( { T t)
-
if (mPending.compareAndSet(true, false)) {
-
observer.onChanged(t);
-
}
-
}
-
});
-
}
-
-
-
public void setValue( { T t)
-
mPending.set(true);
-
super.setValue(t);
-
}
-
-
/**
-
* Used for cases where T is Void, to make calls cleaner.
-
*/
-
-
public void call() {
-
setValue(null);
-
}
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbkgje
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13