一、Observable简介
Observer/Observable是Java提供的一种观察者模式,使用它可以方便地实现各个类之间的通讯。
我们简单地谈一下观察者模式。举一个例子:我们的App中有Main1Activity和Main2Activity两个Activity,从App启动就有一个定时任务,每隔5s两个Activity都需要刷新数据。这个时候只要Main1Activity、Main2Activity都成为Observable的观察者,实现Observer接口,当x 需要执行定时任务时,当Observable调用setChanged();notifyObservers(object);Activity中的的update()方法就会被调用,达到事件和数据传递的作用。
二、MyObservable的实现
public class MyObservable extends Observable {
private static final String TAG = "PortObservable";
private volatile static MyObservable instance;
private MyObservable(){
//注册消息监听器
}
public static MyObservable getInstance(){
synchronized (MyObservable.class) {
if (instance == null) {
instance = new MyObservable();
}
}
return instance;
}
public void post(Object object)
{
setChanged();
notifyObservers(object);
}
/**
* 清理消息监听
*/
public void clear(){
deleteObservers();
instance = null;
}
}
三、MyObservable的使用
3.1 成为MyObservable的观察者
//为MyObservable添加观察者
MyObservable.getInstance().addObserver(this);
3.2 观察者实现Observer接口
//新消息事件会调用update()方法
void update(Observable observable, Object o)
3.3 MyObservable发出消息
MyObservable.getInstance().post(obj);
3.4 删除 MyObservable的观察者
MyObservable.getInstance().deleteObserver(this);
3.5 观察者中update()方法,跟MyObservable.getInstance().post(obj);时所在的线程处于同一线程,使用时需考虑线程问题。
3.6 示例代码
在App时开启定时器,每隔5s发出一次事件
public class App extends Application {
private static final String TAG = "App";
int count=0;
@Override
public void onCreate() {
super.onCreate();
startTimer();
}
private void startTimer() {
TimerTask timerTask=new TimerTask() {
@Override
public void run() {
count++;
String s="定时器已执行"+count+"次";
Log.i(TAG,s);
MyObservable.getInstance().post(s);
}
};
Timer timer=new Timer();
timer.schedule(timerTask,5000,5000);
}
}
Main1Activity和Main2Activity成为MyObservable的观察者,有新消息发送时响应
public class Main1Activity extends AppCompatActivity implements Observer {
private static final String TAG = "Main1Activity";
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
//为MyObservable添加观察者
MyObservable.getInstance().addObserver(this);
textView=findViewById(R.id.tv_show);
findViewById(R.id.btn_action).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(Main1Activity.this,Main2Activity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
MyObservable.getInstance().deleteObserver(this);
super.onDestroy();
}
@Override
public void update(Observable observable, Object o) {
String s=(String)o;
Log.i(TAG,s);
final String text=textView.getText().toString()+s+"\n";
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(text);
}
});
}
}
public class Main2Activity extends AppCompatActivity implements Observer {
private static final String TAG = "Main2Activity";
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
MyObservable.getInstance().addObserver(this);
textView=findViewById(R.id.tv_show);
}
@Override
public void update(Observable observable, Object o) {
String s=(String)o;
Log.i(TAG,s);
final String text=textView.getText().toString()+s+"\n";
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(text);
}
});
}
}
输出结果
04-11 23:24:02.281 10309-10345/com.mq.observable I/App: 定时器已执行1次
04-11 23:24:02.281 10309-10345/com.mq.observable I/Main1Activity: 定时器已执行1次
04-11 23:24:02.281 10309-10345/com.mq.observable I/Main2Activity: 定时器已执行1次
04-11 23:24:07.281 10309-10345/com.mq.observable I/App: 定时器已执行2次
04-11 23:24:07.281 10309-10345/com.mq.observable I/Main1Activity: 定时器已执行2次
04-11 23:24:07.281 10309-10345/com.mq.observable I/Main2Activity: 定时器已执行2次
04-11 23:24:12.281 10309-10345/com.mq.observable I/App: 定时器已执行3次
04-11 23:24:12.281 10309-10345/com.mq.observable I/Main1Activity: 定时器已执行3次
04-11 23:24:12.281 10309-10345/com.mq.observable I/Main2Activity: 定时器已执行3次
04-11 23:24:17.281 10309-10345/com.mq.observable I/App: 定时器已执行4次
04-11 23:24:17.291 10309-10345/com.mq.observable I/Main1Activity: 定时器已执行4次
04-11 23:24:17.291 10309-10345/com.mq.observable I/Main2Activity: 定时器已执行4次
四、MyObservable的使用方法与EventBus的使用方法类似,采用Java原生提供的机制,使用起来更为灵活。
小弟才疏学浅,写此鄙文权当交流和记录,望各路大神指正!