美文网首页
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