一起來寫一個(gè)類似于EventBus的東西

這邊文章寫在睡覺前,所以我會(huì)寫的很快。
首先我沒用過EventBus,但是我看過它的使用介紹。
大概是這樣用的:

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

好的,一個(gè)非常經(jīng)典的觀察者模式。
注冊(cè),發(fā)送事件,取消注冊(cè)。

然后我們自己來實(shí)現(xiàn)一下。

首先我們寫一個(gè)自己的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是個(gè)單例,有個(gè)靜態(tài)的List<EventListener>管理注冊(cè)的類。還有個(gè)post方法用來發(fā)送消息。

EventListener如下:

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

一個(gè)接口,有個(gè)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注冊(cè)到了MyEventBus的List中,一旦調(diào)用了post方法,MainActivity的getMessage(String message)就會(huì)收到post過來的方法。

SecondActivity中調(diào)用了post方法,它會(huì)把信息發(fā)給所有注冊(cè)者,在這里就是我們的MainActivity。

效果如下:


blogtest.gif

總結(jié):

以上就是EventBus的超超超簡(jiǎn)化版,很簡(jiǎn)單對(duì)不對(duì),不過EventBus的源碼當(dāng)然不會(huì)這么簡(jiǎn)單,但是我覺得核心思想就是觀察者模式。

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

就是這樣,晚安~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容