AndroidEventBus V1.0.4版发布啦

如果对于AndroidEventBus不了解的同学请移步 AndroidEventBus的设计与实现。AndroidEventBus库的github地址在这里

新版特性

  1. 支持Sticky事件;
  2. 弱引用持有订阅者,无需手动unregister,避免内存泄露。

什么是Sticky事件?

关于Sticky事件有的同学可能不是很熟悉,Sticky的意思是粘性的。在Android开发中,Sticky事件只指事件消费者在事件发布之后才注册的也能接收到该事件的特殊类型。Android中就有这样的实例,也就是Sticky Broadcast,即粘性广播。正常情况下如果发送者发送了某个广播,而接收者在这个广播发送后才注册自己的Receiver,这时接收者便无法接收到刚才的广播,为此Android引入了StickyBroadcast,在广播发送结束后会保存刚刚发送的广播(Intent),这样当接收者注册完Receiver后就可以接收到刚才已经发布的广播。这就使得我们可以预先处理一些事件,让有消费者时再把这些事件投递给消费者。

AndroidEventBus也提供了这样的功能,有所不同是AndroidEventBus会存储所有的Sticky事件,如果某个事件在不需要再存储则需要手动进行移除。用户通过Sticky的形式发布事件,而消费者也需要通过Sticky的形式进行注册,当然这种注册除了可以接收Sticky事件之外和常规的注册功能是一样的,其他类型的事件也会被正常处理。发布、接收Sticky事件的步骤有如下几步 :

1、发布Sticky事件;

EventBus.getDefault().postSticky("hello");

2、 某个时刻订阅者以Sticky的形式注册


public class MyReceiver {
    public MyReceiver() {
        EventBus.getDefault().registerSticky(this);
    }

    @Subscriber
    private void onStickyEvent(String info) {
        System.out.println("接收到事件 : " + info);
    }

}

当在某个时刻构造MyReceiver时就会将MyReceiver对象以Sticky的形式注册到EventBus中,此时先前发布的”hello”事件就会被MyReceiver对象接收到,因此就会执行onStickyEvent函数,在该函数中实现具体的逻辑即可。当然,不要忘了在某个时刻将MyReceiver注销,以弱引用的形式持有订阅者的功能还没有完成呐!整个过程就这样结束了~

Sticky事件的运用场景

上文中我们简单讲述了Sticky事件的基本使用步骤,这里我们以一个具体的示例来看看Sticky事件在开发中的使用场景。

在开发过程中,我们经常需要在Activity之间传值,我们的做法就是将数据塞到Intent中,并且为每个数据设置一个key。当我们传递的数据是一个实体类时,我们的这个类还需要实现序列化接口,比如Parcelable或者Serializable。例如我们需要将一个用户对象传递到用户个人信息展示页面。我们的常规做法是这样的:

User.java类 :

// 实体类实现序列化
public class User implements Parcelable {
        String name ;
        String phoneNum;
        // 其他字段省略

        public User(String aName) {
            name = aName ;
        }

        public User(Parcel in) {
            super(in);
            name = in.readString();
            phoneNum = in.readString();
        }
       // 代码省略

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeString(phoneNum);
        }

        public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {

        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
 }

然后我们要在某个Activity中将这个用户数据传递给个人信息界面ProfileActivity。代码如下 :

public class MainActivity extends Activity {

    // 某个点击事件
    @Override
    public void onClick(View v) {
        User aUser = new User("Mr.Simple");
        aUser.phoneNum = "123456";
        // 其他数据

        Intent intent = new Intent(this, ProfileActivity.class);
        intent.putParcelable("user", aUser);
        startActivity(intent);
    }
}

在某个点击事件的处理函数中我们通过Intent将数据传递给ProfileActivity。我们再看看ProfileActivity从Intent中取出数据的代码。

public class ProfileActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);
        // 从Bundle中获取数据
        Bundle extraBundle = getIntent().getExtras();
        if (extraBundle != null) {
            User user = extraBundle.getParcelable("user");
        }
    }
}

OK,至此整个过程才算结束了。

大哥,我只是需要传个数据啊!何苦啊!

这种方式产生了很多的样板代码,也让逻辑变得更复杂,容易出错。我们再看看使用Sticky事件的实现方式。

User.java类 :

// 实体类实现序列化
public class User  {
        String name ;
        String phoneNum;
        // 其他字段省略

        public User(String aName) {
            name = aName ;
        }

        // 代码省略
 }

首先User类不需要实现序列化接口,避免了那些样板代码。然后在MainActivity中直接将User对象作为Sticky事件发布即可。

public class MainActivity extends Activity {

    // 某个点击事件
    @Override
    public void onClick(View v) {
        User aUser = new User("Mr.Simple");
        aUser.phoneNum = "123456";
        // 其他数据
        // 发布Sticky事件
        EventBus.getDefault().postSticky(aUser);
        // 跳转到ProfileActivity页面
        Intent intent = new Intent(this, ProfileActivity.class);
        startActivity(intent);
    }
}

最后我们看看ProfileActivity如何接收数据。

public class ProfileActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);

        // 以Sticky的形式注册
        EventBus.getDefault().registerSticky(this);
    }

    @Subscriber
    private void receiveUser(User info){
         // 这里实现你的逻辑即可, info即为传递过来的User对象
    }

}

在ProfileActivity中我们将ProfileActivity自身作为订阅者注册到总线当中,此时ProfileActivity就会接收到上面发布的Sticky事件,这个事件对象就是User对象。此时就会触发ProfileActivity 中的receiveUser函数,info参数就是Sticky事件的那个用户信息对象,在receiveUser中实现自己的逻辑即可。

是的!我们并没有在onDestory中对订阅者进行注销,也就是没有调用EventBus的unregister()函数,这就是最新版的特性之一,也是目前唯一不需要手动注销的事件总线库。

问题是不是简单了很多~ 还有什么场景可以使用Sticky事件呢?Sticky事件是否应该消费完之后自动移除?这些问题大家可以自行思考或者给我留言([email protected]),谢谢。

时间: 2024-08-24 13:56:25

AndroidEventBus V1.0.4版发布啦的相关文章

Python编写 随手记v1.0贺岁版 发布(开源)

随手记是一款占用内存少,便捷的记录软件,用于记录自己的偶然灵感和发现的账号密码(搭建自己的密码库)下载链接:http://pan.baidu.com/s/1eQitQD0 开发目的: 1.我平时经常会分析别人的软件,或者浏览文章时会突然闪现自己的想法,每次都要(新建文本文档,打字,保存,重命名文档)十分麻烦 2.一直想搭建自己的密码库,但是发现新密码后总是很懒,懒着保存起来,利用本程序可以省事的保存 账号密码(默认路径 E:/password.txt) 3. 因为如上原因需要每次花费许多秒, 用

[Android应用]《花界》V1.0 正式版隆重发布!

http://www.cnblogs.com/qianxudetianxia/archive/2012/04/05/2433669.html 1. 软件说明(1). 花界是一款看花软件:“看花,议花,说花,提高您的赏花素养!”. (2). 发布<花界>V1.0正式版,一是检验,综合,统一本博客技术分析,二是从理论到实践的转换. 2. 应用下载下载地址:点击谷歌市场:点击 3. 源码下载源码托管:传送门 4. 业务简介(1). 持续更新高清花朵的图片赏析:(2). 给花儿分门别类,教你区分不同的

ISkyShop B2B2C 商城系统V1.0正式版隆重发布

ISkyShop核心开发团队结合7年电商开发经验,历经1年多时间的设计研发,于2014年6月12日隆重推出ISkyShop B2B2C 商城系统V1.0,B2B2C商城系统是ISkyShop独立自主研发的 商城系统,系统运营模式为"平台自营+商户入驻",平台运营商既可以自营商品盈利,同时对所有入驻商城销售均收取比例佣金,入驻商户定期申请销售结算,方 便快捷,即平台运营商与入驻商户互利共赢,ISkyShop B2B2C 商城系统是国内唯一真正意义上的B2B2C系统. 系统主要特点有: 1

Appium路线图及1.0正式版发布

Appium更新的速度极快,从我试用时候的0.12到1.0beta(0.18版本后就是1.0),完全符合移动互联网的节奏. 整理了testerhome上思寒发表的帖子,让我们来看下历程. 1. appium1.0 beta 和正式版里程碑 appium1.0 beta版本里程碑的issue列表https://github.com/appium/appium/issues?milestone=1&state=open appium1.0正式版本里程碑https://github.com/appiu

Deis 1.0 正式版发布,可用于产品环境!

基于 Docker 的开源 PaaS 系统 Deis 1.0 正式版发布了,这是 Deis 的首个稳定版本,你现在可以在生产环境中使用该系统,这是 Deis 首个基于 Docker 构建的产品级别的 PaaS 系统. Deis 1.0 提供了稳定的 API.丰富的功能特性以及可靠的组件架构.包括: 平台质量  - Deis 由久经沙场的社区进行测试,可处理企业级产品负载 安装便捷 - Deis 可通过一个简单的命令行工具在 30 分钟内安装到 CoreOS 集群中 高可用性 - 整个 Deis

开放源码的微微信.NET 0.8 版发布了

微微信.NET 0.8 版发布了     A.源码应用范围:         未认证的和经过认证的微信订阅号.微信服务号均可使用,本源码的每一个模块都提供完全的 ASP.NET C#源代码,绝对不含封装的DLL , 我们提供的是一套不断更新的源码,需要用户有一些.NET的基础.     B.微信方面功能     01  欢迎消息:微信被关注后用户消息自动回复欢迎消息:     02  关键词回复:微信用户关键字的自动文本.图文.音乐形式回复设置:     03  签到积分:微信的用户每日签到和积

C#电子元件管理系统V1.0正式版

这次刚好有时间,就干脆把电子元件管理系统的v1.0正式版给大家贴出来吧,此次改动在以前的基础上添加了用户管理,以及对界面进行了大量美化.废话就不多说了,直接上图,上源码,欢迎大家参考和指正.

AngularJS 2.0 正式版发布

AngularJS 2.0 正式版发布!!!! (编辑:我说你们能不在节假日发布新版本吗?还让不让人放假了?) 关于新版本的特性,在之前的几个测试版本中已经介绍很详尽了,有兴趣的可以翻译一下之前几个 2.0 的测试版本新闻. Angular 团队接下来主要的工作重点包括以下几个方面: Bug 修复和促进一些新特性 API 更稳定 提供更多指南以及示例(基础教程qkxue.net) 动画方面的进一步增强 Angular Material 2 WebWorkers 从体验版到稳定版 Angular

Redis 3.0正式版发布,正式支持Redis集群

Redis是一个开源.基于C语言.基于内存亦可持久化的高性能NoSQL数据库,同时,它还提供了多种语言的API.近日,Redis 3.0在经过6个RC版本后,其正式版终于发布了.Redis 3.0的最重要特征是对Redis集群的支持,此外,该版本相对于2.8版本在性能.稳定性等方面都有了重大提高. Redis 3.0正式版相对于RC6版本的改进内容包括: 修复了无磁盘情况下的的复制问题: 在角色变化后对BLPOP复制进行了测试: 改进了prepareClientToWrite()错误处理: 移除