Android

Android之撸一个类似EventBus的轮子

2018-05-25  本文已影响0人  Android砖家

用过eventBus的人都知道,在组件及时通讯中,使用非常方便。
一般我们是这样做的:总结为三部曲:

//第一步:注册
EventBus.getDefault().register(this);
//第二步:发送消息
EventBus.getDefault().post(messageEvent);
//取消注册
EventBus.getDefault().unregister(this);

这就是EventBus的强大之处,用过的人都说好,哈哈哈哈!!!!


分析轮子的需求背景

上图描述吧。有图有真相


yhx.png

造轮子需要掌握的知识点

说到知识点,很简单,不想说,那就是接口


接下来,就按照EventBus套路来撸一个。

写一个接口,用来接收发送过来的消息

  /**
 * Created by yi.huangxing on 2018/5/25
 * 类描述:
 */
public interface EventListener {
    //这里面的的参数根据实际需求定义  Sttring  最好是定义一个实体类,扩展性比较强
    void registerMessage(Object object);
}


第二步:XEventBus类

XEventBus类很简单:
1.一个获取单例的方法
2.一个管理List<EventListener>注册类的方法
3.一个发送消息的方法post()

/**
 * Created by yi.huangxing on 2018/5/25
 * 类描述:
 */
    public class XEventBus {

    static XEventBus mXEventBus;
    static List<EventListener> mListeners = new ArrayList<>();

    private XEventBus() {

    }

    /**
     * getDefault 不解释这个取名,按照EventBus来的
     */
    public static XEventBus getDefault() {
        if (mXEventBus == null) {
            return new XEventBus();
        } else {
            return mXEventBus;
        }
    }

    public void register(EventListener listener) {
        mListeners.add(listener);

    }
    public  void unregister(EventListener listener){
        mListeners.remove(listener);

    }

    /**
     * 这个方法也不解释,你懂得
     */
    public  void post(Object object){
        for (EventListener eventListener:mListeners) {
            eventListener.registerMessage(object);
        }
    }
}

XEventBus方法的命名都是套路


如何使用? 就这么简单

Maintivity接收:

public class MainActivity extends AppCompatActivity implements EventListener {
   private TextView mtv_text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mtv_text =findViewById(R.id.tv_text);
        //注册XEventBus
        XEventBus.getDefault().register(this);

        //
        findViewById(R.id.btn_a).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(MainActivity.this,Bctivity.class);
                startActivity(intent);

            }
        });
    }


    @Override
    public void registerMessage(Object object) {
        Toast.makeText(this, (String)object, Toast.LENGTH_SHORT).show();
        //
        mtv_text.setText((String)object);
    }


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

Cctivity 发送

public class Cctivity extends AppCompatActivity {

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

        //
        findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //发送消息
                XEventBus.getDefault().post("这是C传过来的消息");
            }
        });
    }
}

就这么简单

yhx.gif
上一篇下一篇

猜你喜欢

热点阅读