1.首先定義觀察者
/**
* 觀察者
*/
public interface ObServer {
//觀察數據
void update(String data);
}
2.定義操作觀察者的對象
public class ObserverObject {
private static volatile ObserverObject sinstance = null; // <<< 這裏添加了 Appsinstance
private static CommonObservable<ObServer> applicationSubject;
public CommonObservable<ObServer> getObserviceSubject() {
if(applicationSubject == null) applicationSubject = new CommonObservable<>();
return applicationSubject;
}
/**
* 初始化類
* @return
*/
public static ObserverObject getSdkInstance() {
ObserverObject inst = sinstance; // <<< 在這裏創建臨時變量
if (inst == null) {
synchronized (ObserverObject.class) {
inst = sinstance;
if (inst == null) {
inst = new ObserverObject();
sinstance = inst;
}
}
}
return inst; // <<< 注意這裏返回的是臨時變量
}
}
3.設置觀察者的操作
public abstract class Observable<T> {
public final ArrayList<HashMap<String, T>> obserList = new ArrayList<HashMap<String,T>>();
/* 添加觀察者 包括名稱及本生 */
public void attachObserver(String obName, T ob) {
if(obName == null || ob == null) throw new NullPointerException();
synchronized(obserList) {
HashMap<String, T> map = new HashMap<String, T>();
map.put(obName, ob);
int index = obserList.indexOf(map);
if(index == -1) {
obserList.add(map);
}
}
}
/* 刪除觀察者 */
public void detachObserver(String obName) {
if(obName == null) throw new NullPointerException();
synchronized(obserList){
Iterator<HashMap<String, T>> iteratorMap = obserList.iterator();
while(iteratorMap.hasNext()) {
Iterator<Entry<String, T>> iterator = iteratorMap.next().entrySet().iterator();
while(iterator.hasNext()){
if(iterator.next().getKey().equals(obName)){
iteratorMap.remove();
break;
}
}
}
}
}
/** detach all observers */
public void detachObservers() {
synchronized(obserList) {
obserList.removeAll(obserList);
}
}
/** Ruturn the size of observers */
public int countObservers() {
synchronized(obserList) {
return obserList.size();
}
}
public abstract void notifyObserver(String data);
public abstract void notifyObserver(String obserName, boolean flag, String s);
}
4.實現
public class CommonObservable<T extends ObServer> extends Observable<T> {
/** 實現抽象方法通知觀察者,
* 第一個參數爲觀察者名字,
* 第二個參數flag標誌表示如果沒有找到觀察者是否通知其他所有觀察者(true是false否),
* 第三個爲需要傳遞的參數
*/
String test="";
@Override
public void notifyObserver(String obserName, boolean flag, String s) {
// TODO Auto-generated method stub
if(obserName != null && !(obserName instanceof String)) return;
for(HashMap<String, T> map : obserList){
if(map.containsKey(obserName)) {
((T)map.get(obserName)).update(s);
test=s;
break;
}
}
if(flag) {
for(HashMap<String, T> map : obserList){
Iterator<Entry<String, T>> iterator = map.entrySet().iterator();
((T)iterator.next().getValue()).update(s);
}
}
}
/**
* 通知觀察者內容
* 通知內容爲data,String類型
* @param data
*/
@Override
public void notifyObserver(String data) {
// TODO Auto-generated method stub
for(HashMap<String, T> map : obserList){
Iterator<Entry<String, T>> iterator = map.entrySet().iterator();
((T)iterator.next().getValue()).update(data);
}
}
}
使用示例
通過下列操作綁定觀察者
ObserverObject sdk = ObserverObject.getSdkInstance();
obserSubjet = sdk.getObserviceSubject();
obserSubjet.attachObserver("TransferJetSdk", (ObServer) this);
發送消息
if (obserSubjet != null) {
obserSubjet.notifyObserver("StopService");
}
解綁
obserSubjet.detachObserver("TransferJetSdk");
接收數據
public class TransferJetSdk implements ObServer {
@Override
public void update(String data) {
TjetLog.e("obj", "---------" + data);
}
}
即可實現EventBus的基礎功能