Android使用Observer/Observable实现简易版的EventBus

一、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原生提供的机制,使用起来更为灵活。

小弟才疏学浅,写此鄙文权当交流和记录,望各路大神指正!

GitHub代码地址



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值