流程
创建StickyLiveData,重写setValue、postValue,使用int类型的mVersion保存被设置值的次数
创建WrapperObserver,重写onChanged,判断事件是否重发,解决普通事件和粘性事件的问题
ConcurrentHashMap存储EventName,和StickyLiveData
代码
package com.mooc.libcommon.extention;
import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
import java.util.concurrent.ConcurrentHashMap;
public class LiveDataBus {
private static class Lazy {
static LiveDataBus sLiveDataBus = new LiveDataBus();
}
public static LiveDataBus get() {
return Lazy.sLiveDataBus;
}
private static ConcurrentHashMap<String, StickyLiveData> mHashMap = new ConcurrentHashMap<>();
public StickyLiveData with(String eventName) {
StickyLiveData liveData = mHashMap.get(eventName);
if (liveData == null) {
liveData = new StickyLiveData(eventName);
mHashMap.put(eventName, liveData);
}
return liveData;
}
public static class StickyLiveData<T> extends LiveData<T> {
private String mEventName;
private T mStickyData;
private int mVersion = 0;
public StickyLiveData(String eventName) {
mEventName = eventName;
}
@Override
public void setValue(T value) {
mVersion++;
super.setValue(value);
}
@Override
public void postValue(T value) {
mVersion++;
super.postValue(value);
}
public void setStickyData(T stickyData) {
this.mStickyData = stickyData;
setValue(stickyData);
}
public void postStickyData(T stickyData) {
this.mStickyData = stickyData;
postValue(stickyData);
}
@Override
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
observerSticky(owner, observer, false);
}
public void observerSticky(LifecycleOwner owner, Observer<? super T> observer, boolean sticky) {
super.observe(owner, new WrapperObserver(this, observer, sticky));
owner.getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
if (event == Lifecycle.Event.ON_DESTROY) {
mHashMap.remove(mEventName);
}
}
});
}
private class WrapperObserver<T> implements Observer<T> {
private StickyLiveData<T> mLiveData;
private Observer<T> mObserver;
private boolean mSticky;
private int mLastVersion = 0;
public WrapperObserver(StickyLiveData liveData, Observer<T> observer, boolean sticky) {
mLiveData = liveData;
mObserver = observer;
mSticky = sticky;
mLastVersion = mLiveData.mVersion;
}
@Override
public void onChanged(T t) {
if (mLastVersion >= mLiveData.mVersion) {
if (mSticky && mLiveData.mStickyData != null) {
mObserver.onChanged(mLiveData.mStickyData);
}
return;
}
mLastVersion = mLiveData.mVersion;
mObserver.onChanged(t);
}
}
}
private static void handler() {
Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
}
};
mHandler.sendMessage(new Message());
}
private static void liveData(Activity activity) {
MutableLiveData<String> mLiveData = new MutableLiveData<>();
mLiveData.observe((LifecycleOwner) activity, new Observer() {
@Override
public void onChanged(Object o) {
}
});
mLiveData.postValue("fage");
}
private static void stickyLiveData(Activity activity) {
MutableLiveData<String> mLiveData = new MutableLiveData<>();
mLiveData.postValue("dage");
mLiveData.observe((LifecycleOwner) activity, new Observer<String>() {
@Override
public void onChanged(String s) {
}
});
}
}
LiveDataBus.get()
.with(InteractionPresenter.DATA_FROM_INTERACTION)
.observe((LifecycleOwner) mContext, mFeedObserver);
private FeedObserver mFeedObserver;
private class FeedObserver implements Observer<Feed> {
private Feed mFeed;
@Override
public void onChanged(Feed newOne) {
if (mFeed.id != newOne.id) {
return;
}
mFeed.author = newOne.author;
mFeed.ugc = newOne.ugc;
mFeed.notifyChange();
}
public void setFeed(Feed feed) {
mFeed = feed;
}
}