事件总线EventBus
为了简化并且更加高质量的在Activity,Fragment,Thread和Servcie之间进行通信,同时解决组件之间高耦合时仍然能够继续高效通信,因此应用事件总线。
1.EventBus是一款针对于Android优化的发布——订阅事件总线,简化了应用程序内各组件间,组件与后台进程间的通信。
2.使用EventBus
EventBus三要素如下:
Event:事件,可以是任意类型的对象
Subscriber:事件订阅者
Publisher:事件发布者。可以在任意线程任意位置发送事件
3.EventBus4种ThreadMode(线程模型)
1.POSTING(默认):如果使用事件处理函数指定了线程模型是POSTING,那么该事件是从哪个线程发出的,事件处理函数就会在哪个线程运行,发布事件和处理事件在同一个线程中,在线程模型为POSTING的事件处理函数中应该避免执行耗时操作,他会阻塞事件的传递,甚至用可能引起ANR。
2.MAIN:事件的处理会在UI线程中执行,处理事件不能过长,会引起ANR。
3.BACKGROUND:如果事件是由UI线程发布出来的,那么该事件的处理函数会在新线程中运行,如果事件本身就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中运行,在此事件处理函数中禁止更新UI操作的。
4.ASYNC:无论事件是在哪个线程中发布出来的,该事件的处理函数都会在新建的子线程中执行,同样,此事件处理函数禁止进行UI更新操作。
4.EventBus基本步骤
1.自定义一个事件类
2.在需要订阅事件的地方注册事件
3.发送事件
4.处理事件
5.取消事件订阅
5.EventBus的黏性事件
在事件发送以后订阅该事件也可以收到该事件。
6.举个栗子
1.引入
implementation 'org.greenrobot:eventbus:3.0.0'
2.自定义事件类
package com.example.yang.mvp.model;
public class MessageEvent {
private String message;
public MessageEvent(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
3.在需要订阅事件的地方注册事件
package com.example.yang.mvp.ipinfo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.yang.mvp.R;
import com.example.yang.mvp.model.MessageEvent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class IpInfoActivity extends AppCompatActivity {
private TextView textView;
private Button bt_message;
private Button bt_subscription;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.textview);
bt_message=findViewById(R.id.bt_message);
bt_subscription=findViewById(R.id.bt_subscription);
bt_message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(IpInfoActivity.this,SeconedActivity.class));
}
});
bt_subscription.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().register(IpInfoActivity.this);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent){
//可以用来传递给任何需要这个数据的activity
textView.setText(messageEvent.getMessage());
Toast.makeText(getApplicationContext(),"鸡你太美" ,Toast.LENGTH_SHORT ).show();
}
}
4.发送事件
package com.example.yang.mvp.ipinfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.yang.mvp.R;
import com.example.yang.mvp.model.MessageEvent;
import org.greenrobot.eventbus.EventBus;
public class SeconedActivity extends AppCompatActivity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seconed);
textView=findViewById(R.id.textview2);
button=findViewById(R.id.bt_publish);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEvent("你是大傻逼"));
finish();
}
});
}
}
5.处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent){
//可以用来传递给任何需要这个数据的activity
textView.setText(messageEvent.getMessage());
Toast.makeText(getApplicationContext(),"鸡你太美" ,Toast.LENGTH_SHORT ).show();
}