美文网首页
Android组件通信方式 之 EventBus

Android组件通信方式 之 EventBus

作者: Sharkchilli | 来源:发表于2020-12-22 21:31 被阅读0次

    Android组件常用的通信方式

    1.Bundle
    Bundle本质使用的是arrayMap
    我们可以在跳转Activity时将Bundle放入到Intent

    Bundle bundle = new Bundle();
    bundle.putString("name", "chenjy");
    bundle.putInt("age", 18);
    
    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
    intent.putExtras(bundle);
    startActivity(intent);
    

    Bundle可以传递基本数据类型和String类型的数据,如果传递的是对象就需要进行序列化。

    java提供的序列化为Serializable这种序列化是通过反射机制从而削弱了性能,这种机制也创建了大量的临时对象从而引起GC频繁回收调用资源。
    google提供了Parcelable ,Parcelable是由Android提供的序列化接口,google做了大量的优化

    2.类静态变量
    使用类名.变量名传递
    3.Application
    Application 中的全局静态变量来实现

    我们可以看到上面的方式都显得代码量多,组件间容易产生耦合引用。
    这次就介绍一个开源的框架EventBus

    EventBus

    下面是官方的图


    image.png

    主要有三个角色
    Publisher(发布者)
    Subscriber(订阅者)
    Event(事件类型)

    导入项目

        implementation 'org.greenrobot:eventbus:3.1.1'
    

    1.消息事件类型可以是基本数据类型,也可以是自定义类。我们这里使用自定义类做示例

    package com.shark.msg;
    
    public class EventMessage {
        private int type;
        private String message;
    
        public EventMessage(int type, String message) {
            this.type = type;
            this.message = message;
        }
    
        @Override
        public String toString() {
    
            return "type=" + type + "--message= " + message;
        }
    
        public int getType() {
            return type;
        }
    
        public void setType(int type) {
            this.type = type;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    

    2.我们在MainActivity注册eventbus
    在onstart方法中使用EventBus.getDefault().register(this);订阅事件。订阅的对象就是MainActivity自己。所以我们要在MainActivity中实现一个有@Subscribe注解的方法,用来接受事件发送。这个方法的参数就是我们上面定义的消息事件类型。最后在onDestroy方法中unregister。

    package com.shark.eventbustest;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    import com.shark.msg.EventMessage;
    
    import org.greenrobot.eventbus.EventBus;
    import org.greenrobot.eventbus.Subscribe;
    import org.greenrobot.eventbus.ThreadMode;
    
    public class MainActivity extends AppCompatActivity {
    
        private Button button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = findViewById(R.id.jump);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            //注册(订阅)事件 Subscriber为本实例
            EventBus.getDefault().register(this);
        }
    
        //发布消息后 订阅者会执行下面方法
        //该方法需要用@Subscribe注解进行修饰。
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onReceiveMsg(EventMessage message) {
            Log.e("Shark:", "onReceiveMsg: " + message.toString());
        }
    
        @Override
        protected void onStop() {
            super.onStop();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            EventBus.getDefault().unregister(this);
        }
    }
    

    3.我们在另一个Activity中,发布消息
    使用EventBus.getDefault().post(msg);发布消息

    package com.shark.eventbustest;
    
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    
    import com.shark.msg.EventMessage;
    
    import org.greenrobot.eventbus.EventBus;
    
    public class SecondActivity extends AppCompatActivity {
    
        private Button btn;
    
        //发布消息的点击事件
        private View.OnClickListener mSendListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("Shark:", "onClick: ");
                EventMessage msg = new EventMessage(1, "Hello MainActivity");
                //发布消息
                EventBus.getDefault().post(msg);
            }
        };
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
            btn = findViewById(R.id.test);
            btn.setOnClickListener(mSendListener);
        }
    }
    

    运行项目跳转到SecondActivity后,触发点击事件后结果如下:

    2020-12-22 16:20:44.301 1867-1867/com.shark.eventbustest E/Shark:: onClick: 
    2020-12-22 16:20:44.302 1867-1867/com.shark.eventbustest E/Shark:: onReceiveMsg: type=1--message= Hello MainActivity
    

    Subscribe

    @Subscribe是EventBus自定义的一种注解,他可接收三个参数。ThreadMode、boolean sticky、int priority。

    具体可以看一下官方文档或下方文章

    参考

    EventBus 使用(全面分析,细节提醒)
    Android activity间通讯几种方式

    相关文章

      网友评论

          本文标题:Android组件通信方式 之 EventBus

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