美文网首页Android
Android之撸一个类似EventBus的轮子

Android之撸一个类似EventBus的轮子

作者: Android砖家 | 来源:发表于2018-05-25 15:29 被阅读0次

    用过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

    相关文章

      网友评论

        本文标题:Android之撸一个类似EventBus的轮子

        本文链接:https://www.haomeiwen.com/subject/pkiyjftx.html