- 定义一个 Observable 子类
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
public class LGFObservable extends Observable {
/**
* 通知 model
*/
public static class model<OV> {
public String name;// 通知名字
public OV obj;// 传递的对象
}
/**
* Observer update 回参类型泛型优化转换
*/
public static abstract class observer implements Observer {
@Override
public void update(final Observable observable, final Object o) {
runOnUiThread(new Runnable() {
@Override
public void run() {
lgf_Update(observable, (model)o);
}
});
}
abstract public void lgf_Update(Observable observable, model obj);
}
/**
* 堆内所有通知
*/
private Map<String, ArrayList<observer>> observerMap;
/**
* Observable 单列初始化
*/
private volatile static LGFObservable lgf_Observable = null;
public static LGFObservable lgf() {
if (lgf_Observable == null) {
synchronized (LGFObservable.class) {
if (lgf_Observable == null) {
lgf_Observable = new LGFObservable();
lgf_Observable.observerMap = new HashMap<>();
}
}
}
return lgf_Observable;
}
/**
* Fragment 独立维护一组 Observer
*/
public <F> void addObserver(F fragment, observer o) {
ArrayList<observer> observers = observerMap.get(fragment.getClass().getName());
if (observers == null) { observers = new ArrayList<>(); }
observers.add(o);
observerMap.put(String.valueOf(System.identityHashCode(fragment)), observers);
lgf_Observable.addObserver(o);
}
/**
* 防止 Observer 乱入,每个 Fragment 维护一组 Observer 记得在该 Fragment 销毁前移除所有属于该 Fragment 的 Observer
*/
public <F> void removeObserver(F fragment) {
observerMap.remove(String.valueOf(System.identityHashCode(fragment)));
}
/**
* 发送通知 arg 为通知参数用于接收位置的判断
*/
public void postObserver(String name) {
postObserver(name, null);
}
public <OV> void postObserver(String name, OV obj) {
lgf_Observable.setChanged();
model model = new model<OV>();
model.name = name;
model.obj = obj;
lgf_Observable.notifyObservers(model);
}
}
-
可以愉快的在未释放内存的各个 Fragment/Activity/View/Class 间通信啦
-
这里暂用 Fragment 示例
-
在任意位置的 Fragment 发送通知
// 任意 Fragment
public class LGFTestFragmentOther extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// 在需要启动传值的地方发送 LGFObservable
// 这里的 name 就是要通知的名字
LGFObservable.lgf().postObserver("FaSong888", "我是要传的值:888");
return inflater.inflate(R.layout.fragment_login, container, false);
}
}
- 在需要接收的地方接收通知传值
public class LGFTestFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// 在需要被传值的 Fragment 中注册 LGFObservable
LGFObservable.lgf().addObserver(this, new LGFObservable.observer() {
@Override
public void lgf_Update(Observable observable, LGFObservable.model obj) {
if (obj.name.equals("FaSong888")) {// 接收名字必须和发送名字对应才可以取到对应的值
// obj 就是 post 过来的数据
// obj.obj == "我是要传的值:888"
System.out.print(obj.obj);
} else if ...
// 这里可以注册多个名字,只要系统任意位置有地方执行了该 name 的 post
// 且该类内存未被释放也就是这里的 LGFObservable.lgf().removeObserver(this); 方法未走
// 就都可以收到来自各方的通知传值
}
});
return inflater.inflate(R.layout.fragment_login, container, false);
}
@Override
public void onDestroyView() {
// 记注,如果 Fragment 销毁,请也销毁绑定的 LGFObservable,这段可写在基类里
LGFObservable.lgf().removeObserver(this);
super.onDestroyView();
}
}
网友评论