EventBus的特性及简单的使用介绍

EventBus是一个用于Android和Java的开源库,使用发布者/订阅者模式(publisher/subscriber pattern)实现松散(loose)耦合(coupling)。EventBus使中央通信仅用几行代码就能解耦类(decouple classes)——简化代码(simplifying the code)、消除依赖(removing dependencies)和加速应用程序开发(speeding up app development)。

使用EventBus的好处:

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

更多EventBus特性:

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

EventBus特性:

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

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

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

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

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

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

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

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

可配置:要根据您的需求调整EventBus,您可以使用建造者模式(builder pattern)调整它的行为。

三步使用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 + '\'' +
                '}';
    }
}

第二步:准备订阅者

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

订阅者还需要将自己注册到总线(bus)并从总线注销。只有当订阅者注册时,他们才会接收事件(receive events)。在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);
    }
}

第三步::发布事件

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

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 !

感谢所有!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

windfallsheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值