Android之EventBus

事件总线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();
    }
关于EventBus的原理先不追究,熟练使用后再一探究竟!
发布了123 篇原创文章 · 获赞 74 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43927892/article/details/102412773