EventBus介绍

2019/7/21 15:35:52 人评论 次浏览 分类:学习教程

EventBus是一个用于Android和Java的开源库,使用发布者/订阅者模式实现松散耦合。EventBus使中央通信仅用几行代码就能解耦类——简化代码、消除依赖和加速应用程序开发。

使用EventBus的好处:

  • 简化组件之间的通信
  • 解耦事件发送方和接收方
  • 能够很好地处理UI工件(例如活动、片段)和后台线程
  • 避免复杂和容易出错的依赖关系和生命周期问题
  • 快速;专为高性能而优化
  • 很小(<50k jar)
  • 在实践中是否被安装超过1亿次的应用程序所证明
  • 具备高级特性,如delivery线程、订阅者(subscriber)优先级等。

更多EventBus特性:

  • 方便的基于注解的API(Convenient Annotation based API):只需将@Subscribe注解添加到时订阅方方法上。由于注解的构建时索引,EventBus在应用程序运行时不需要进行注释反射。
  • Android主线程递送(Android main thread delivery):当与UI交互时,EventBus可以在主线程中递送事件,而不管事件是如何发布的。
  • 后台线程递送(Background thread delivery):如果订阅服务器执行长时间运行的任务,EventBus还可以使用后台线程来避免UI阻塞。
  • 事件和订阅程序继承(Event & Subscriber inheritance):在EventBus中,面向对象范式应用于事件和订阅程序类。假设事件类A是B的超类。B类型的已发布事件也将被发布给对A感兴趣的订阅者。类似的还有订阅者类的继承也应该被考虑到。
  • 跳跃式启动(Jump start):您可以立即开始 —— 不需要配置任何东西 —— 使用可用的默认EventBus实例,从你代码中任何地方。
  • 可配置的(Configurable):要根据您的需求调整EventBus,您可以使用builder模式调整它的行为。

EventBus特性:

简单但功能强大:EventBus是一个小型库,具有超级容易学习的API。尽管如此,您的软件架构可能会从解耦组件中获益良多:订阅者在使用事件时并不知道发送者。

实战测试:EventBus是最常用的Android库之一:数以千计的应用程序使用EventBus,包括非常流行的应用程序。超过10亿的应用程序安装说明了一切。

高性能:尤其是在Android上,性能很重要。对EventBus进行了大量的分析和优化;这可能是最快的解决方案。

方便的基于注解的API(不牺牲性能):只需将@Subscribe注解放到订阅方方法中。由于注解的构建时索引,EventBus在应用程序运行时不需要进行注释反射,这在Android上非常慢。

Android主线程交付:当与UI交互时,EventBus可以在主线程中交付事件,而不管事件是如何发布的。

后台线程交付:如果订阅服务器执行长时间运行的任务,EventBus还可以使用后台线程来避免UI阻塞。

事件和订阅程序继承:在EventBus中,面向对象范式应用于事件和订阅程序类。假设事件类A是B的超类。B类型的已发布事件也将被发布给对A感兴趣的订阅者。

零配置:您可以立即使用代码中任何地方可用的默认EventBus实例启动。

可配置:要根据您的需求调整EventBus,您可以使用构建器模式调整它的行为。

三步使用EventBus 3:

第一步:定义事件

事件(Events)是POJO(普通的旧Java对象),没有任何特定的需求。

package com.windfallsheng.myeventbus;

public class EventData {

    public String userName;
    public String message;

    public EventData(String userName, String message) {
        this.userName = userName;
        this.message = message;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String toString() {
        return "EventData{" +
                "userName='" + userName + '\'' +
                ", message='" + message + '\'' +
                '}';
    }
}

第二步:准备订阅者

订阅者实现事件处理方法(也称为“订阅者方法”),这些方法将在发布事件时调用。这些是用@Subscribe注解定义的。
注意,使用EventBus 3 时可以自由选择方法名(不像EventBus 2时那样有命名约定)。

订阅者还需要将自己注册到总线并从总线注销。只有当订阅者注册时,他们才会接收事件。在Android中,在 activities 和 fragments中,您通常应该根据它们的生命周期进行注册。

package com.windfallsheng.myeventbus;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private Button mBtnJumpToPost, mBtnPostStickyEvent;
    private TextView mTvMessage;
    private String userArray[] = {"Cyra", "Morgen", "Iris", "Mia"};
    private String messageArray[] = {"我发表了新的美食文章", "我更新了我的相册", "我在FaceBook申请了账号", "我做了一个好看的小视频"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTvMessage = (TextView) this.findViewById(R.id.tv_message);
        mBtnJumpToPost = (Button) this.findViewById(R.id.btn_jump_to_post);
        mBtnPostStickyEvent = (Button) this.findViewById(R.id.btn_post_sticky_event);
        mBtnJumpToPost.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PostActivity.start(MainActivity.this);
            }
        });
        mBtnPostStickyEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int uIndex = (int) (Math.random() * userArray.length);
                int mIndex = (int) (Math.random() * messageArray.length);
                final EventData eventData = new EventData(userArray[uIndex], messageArray[mIndex]);
                Log.i(TAG, "method:onCreate#mBtnPostStickyEvent#onClick#eventData=" + eventData);
                EventBus.getDefault().postSticky(eventData);
                Log.i(TAG, "method:onCreate#mBtnPostStickyEvent#onClick#Post sticky event finish.");
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Log.i(TAG, "method:onCreate#mBtnPostStickyEvent#onClick#postDelayed#准备跳转至StickyActivity");
                        StickyActivity.start(MainActivity.this);
                    }
                }, 2000);
            }
        });
        EventBus.getDefault().register(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void refreshMessage(EventData eventData) {
        Log.i(TAG, "method:refreshMessage#eventData=" + eventData);
        mTvMessage.setText(eventData.getUserName() + ":\n\n" + eventData.getMessage());
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

第三步::发布事件

从代码的任何部分发布事件。所有当前注册的与事件类型匹配的订阅者都将收到它。

package com.windfallsheng.myeventbus;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import org.greenrobot.eventbus.EventBus;

/**
 * Created by Administrator on 2016/11/17 0017.
 */

public class PostActivity extends AppCompatActivity {

    private static final String TAG = PostActivity.class.getSimpleName();
    private Button mBtnSendEventData;
    private String userArray[] = {"Cyra", "Morgen", "Iris", "Mia"};
    private String messageArray[] = {"我发表了新的美食文章", "我更新了我的相册", "我在FaceBook申请了账号", "我做了一个好看的小视频"};

    public static void start(Context context) {
        context.startActivity(new Intent(context, PostActivity.class));
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "method:onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post);
        mBtnSendEventData = (Button) this.findViewById(R.id.btn_send_event_data);
        mBtnSendEventData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int uIndex = (int) (Math.random() * userArray.length);
                int mIndex = (int) (Math.random() * messageArray.length);
                EventData eventData = new EventData(userArray[uIndex], messageArray[mIndex]);
                Log.i(TAG, "method:onCreate#mBtnSendEventData#onClick#eventData="+eventData);
                EventBus.getDefault().post(eventData);
//                finish();
            }
        });
    }
}

 

 

GitHub地址

由于作者水平有限,语言描述及代码实现中难免有纰漏,望各位看官多提宝贵意见!

Hello , World !

感谢所有!

相关资讯

    暂无相关的资讯...

共有访客发表了评论 网友评论

验证码: 看不清楚?
    -->