Android组件通信方式 之 EventBus
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。
具体可以看一下官方文档或下方文章