一起來寫一個類似于EventBus的東西

這邊文章寫在睡覺前,所以我會寫的很快。
首先我沒用過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的源碼當然不會這么簡單,但是我覺得核心思想就是觀察者模式。

對一個開源框架,我們要了解它的內涵,而不是拿來用,覺得哇好帥啊,就完事了。我們可以看看它的介紹,然后想想如果是自己去寫一個類似的框架,你會怎么寫。

就是這樣,晚安~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 項目到了一定階段會出現一種甜蜜的負擔:業務的不斷發展與人員的流動性越來越大,代碼維護與測試回歸流程越來越繁瑣。這個...
    fdacc6a1e764閱讀 3,209評論 0 6
  • 目錄 1.概述 2.實戰 1.基本框架搭建 2.新建一個類FirstEvent 3.在要接收消息的頁面注冊Even...
    慕涵盛華閱讀 10,526評論 2 16
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,818評論 25 708
  • 七律/大花蘆莉 作者:心博、圖片:網絡 此君實謂品尤佳,一年四季顯其華。 橢圓綠葉顏如玉,五瓣桃紅色比霞。 單朵芬...
    心博1閱讀 446評論 0 3