android 开发程序员Android开发经验谈Android开发

一起来写一个类似于EventBus的东西

2018-03-12  本文已影响77人  陈添

这边文章写在睡觉前,所以我会写的很快。
首先我没用过EventBus,但是我看过它的使用介绍。
大概是这样用的:

EventBus.getDefault().register(this);
EventBus.getDefault().post(messageEvent);
EventBus.getDefault().unregister(this);

好的,一个非常经典的观察者模式。
注册,发送事件,取消注册。

然后我们自己来实现一下。

首先我们写一个自己的MyEventBus:

public class MyEventBus {
    static MyEventBus myEventBus;
    static List<EventListener> listeners = new ArrayList<>();

    private MyEventBus(){

    }

    public static MyEventBus getDefault(){
        if(myEventBus==null){
            return new MyEventBus();
        }else {
            return myEventBus;
        }
    }

    public void register(EventListener eventListener){
        listeners.add(eventListener);
    }

    public void unregister(EventListener eventListener){
        listeners.remove(eventListener);
    }

    public void post(String message){
        for(EventListener eventListener:listeners){
            eventListener.getMessage(message);
        }
    }
}

MyEventBus是个单例,有个静态的List<EventListener>管理注册的类。还有个post方法用来发送消息。

EventListener如下:

public interface EventListener {
    void getMessage(String message);
}

一个接口,有个getMessage方法用来接收post的信息。

MainActivity:

public class MainActivity extends AppCompatActivity implements EventListener{

    TextView textView;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.text_view);
        button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
        MyEventBus.getDefault().register(this);
    }

    @Override
    public void getMessage(String message) {
        textView.setText(message);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        MyEventBus.getDefault().unregister(this);
    }
}

SecondActivity:

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);

        Button button = findViewById(R.id.send_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyEventBus.getDefault().post("你好呀,MainActivity");
                finish();
            }
        });
    }
}

MainActivity注册到了MyEventBus的List中,一旦调用了post方法,MainActivity的getMessage(String message)就会收到post过来的方法。

SecondActivity中调用了post方法,它会把信息发给所有注册者,在这里就是我们的MainActivity。

效果如下:


blogtest.gif

总结:

以上就是EventBus的超超超简化版,很简单对不对,不过EventBus的源码当然不会这么简单,但是我觉得核心思想就是观察者模式。

对一个开源框架,我们要了解它的内涵,而不是拿来用,觉得哇好帅啊,就完事了。我们可以看看它的介绍,然后想想如果是自己去写一个类似的框架,你会怎么写。

就是这样,晚安~

上一篇 下一篇

猜你喜欢

热点阅读