黑马程序员技术交流社区

标题: 1.EventBus3.0开发详解 近万开发者收藏 [打印本页]

作者: 翁志雄Gson    时间: 2016-5-10 20:59
标题: 1.EventBus3.0开发详解 近万开发者收藏
1. EventBus3.0开发详解 近万开发者收藏

1.1. 什么是EventBus?
eventBusGreenRobot公司出品的一个基于【publish/subscribe】模型的开发库

一.GreenRobot公司除了出品eventBus还出品了比较有名的greenDao(sqlite数据库的orm开发框架)
可以看出GreenDaostar数为4581 EventBusstar数更高 9564 (star数是一个框架/项目影响力的指标)

二.publish/subscribe是一个以发送消息与接收消息模型。以前咱们学习过相似的知识点有

1.sendBroadcastBroadcastReceiver是一个典型
2.handler.sendMessagehandleMessage(Message msg)也是一个典型
3.所以该模型主要包含两个方面 一个是发送消息 一个是接收消息

三.优点
a.代码简洁、层次清晰,大大提高了代码的可读性和可维护性。
b.可以通过简单的代码把数据传递给Activities, Fragments, Threads, Services等等

1.2. 下载EventBus官方SDK
Github下载地址为:

https://github.com/greenrobot/EventBus

1.3. 创建Demo程序
下载到的zip
解压后为


本例使用Android Studio2.0
可以更简单的在 app/build.gradle


如下配置即可

然后运行gradle脚本

1.4. 快速开始
EventBus的方法非常简洁只要掌握以下方法基本就可以完成企业开发了

一.注册与移除
EventBus.getDefault().register(this);注册
EventBus.getDefault().unregister(this);解除
以上两个方法使用上跟广播接收者的注册与使用是类似的有注册必须在使用后移除
Activity为例:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
    }

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

二.发送消息
发布消息的对象即为【publisher】发布者

EventBus.getDefault().post(new MainMessage("Hello EventBus"));
Post参数类型为普通javaBean

public class MainMessage {
    private String msg;
    public MainMessage(String msg) {
        this.msg = msg;
    }
    public String getMsg() {
        return msg;
    }
}

三.消息的接收处理(建议使用onEventXXX写法)
接收消息的对象即为【subscriber】 订阅者

//主线程中执行
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void onMainEventBus(MainMessage msg) {
        Log.d(TAG, "onEventBus() returned: " + Thread.currentThread());
}
@Subscribe在案例中会细细地讲解 因为是一个大重点

1.5. 案例分析:代替请求码与响应码
MainActivity请求一个NextPageActivity要求该NextPageActivity关闭时把数据传回给MainActivity

startActivityForResult请求代码略

开发步骤

一.在zaowu.itheima.com.eventbusdemo.demo1.FistEvent创建消息类(post作为发送内容)

public class FistEvent {
    private String msg;
    public FistEvent(String msg) {
        this.msg = msg;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

二.zaowu.itheima.com.eventbusdemo.demo1.MainActivity

》》1..加载布局
layout/activity_main.xml

》》2..注册与移除 订阅者

public class MainActivity extends AppCompatActivity {
    private  TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView= (TextView) findViewById(R.id.main_activity_tv);
        //注册事件
        EventBus.getDefault().register(this);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //移除注册
        EventBus.getDefault().unregister(this);
    }
    public void open(View view) {
        startActivity(new Intent(this, NextPageActivity.class));
    }


》》3..编写订阅者接收消息方法

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(FistEvent event) {
    Log.i("itheima", "onEventMainThread:"+event.getMsg()+Thread.currentThread());
    textView.setText(event.getMsg());
}

l @Subscribe设置订阅者接收处理消息的方法
l 可以给该注解配置线程参数@Subscribe(threadMode = ThreadMode.MAIN)
l ThreadMode用来指定线程

》》4..zaowu.itheima.com.eventbusdemo.demo1.NextPageActivity点击发送消息并关闭

public class NextPageActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_next_page);
    }
    public void event1(View view) {
        //发送消息
        FistEvent fistMessage = new FistEvent("NextPageActivity-FistEvent");
        EventBus.getDefault().post(fistMessage);
    }
}


运行前后
==

控件制台显示:消息已经由NextPageActivity传给MainActivity了。显示main主线程

不过首先注意一点eventBus将消息传给参数类型一致的方法

eventBus底层post出消息后,会查找作为subscriber订阅者的参数类型一致的方法然后向这些方法传递post出来的消息。
所以当订阅者有两个以上参数类型一致的方法时都会接收到消息。


建议开发者创建不同的javaBean类来代表不同的消息类型
1.6. ThreadMode原理
ThreadMode.MAIN标注方法运行在主线程,可以更新UI
ThreadMode.BACKGROUND标注方法运行在子线程,,不可以更新UI但可以执行耗时代码
ThreadMode.POSTING 标注方法 运行在跟post一样的线程。如果post在主线程此时相当于MAIN,反之相当于BACKGROUND
ThreadMode.ASYNC标注方法运行在子程。但是跟BACKGROUND有区别。举个例子如果ASYNC标注的方法将要运行时有一个BACKGROUND标注的方法正在运行(延时10),前者标注的方法不会等待10秒结束再运行,而是另外开一个线程运行。

以下是EventBus的源代码分析



1.7. 案例分析:代替广播接收者
如果掌握了EventBus就可以不用广播接收者来发送消息接收消息了,用EventBus更简洁。

一.创建不同的消息对象
zaowu.itheima.com.eventbusdemo.demo2.MainEvent
zaowu.itheima.com.eventbusdemo.demo2.BackGroundEvent
zaowu.itheima.com.eventbusdemo.demo2.AsyncEvent
zaowu.itheima.com.eventbusdemo.demo2.PostingEvent

public class MainEvent {
    private String msg;

    public MainEvent(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}


二.发送不同的消息

layout/activity_threadmode.xml
zaowu.itheima.com.eventbusdemo.demo2.ThreadModeActivity

public void event1(View view) {
    //发送消息
    MainEvent mainEvent = new MainEvent("MainEvent");
    EventBus.getDefault().post(mainEvent);
    Log.i("itheima", "post(mainEvent);"+System.currentTimeMillis());
}
public void event2(View view) {
    //发送消息
    BackGroundEvent backGroundEvent = new BackGroundEvent("BackGroundEvent");
    EventBus.getDefault().post(backGroundEvent);
    Log.i("itheima", "post(backGroundEvent);"+System.currentTimeMillis());
}
public void event3(View view) {
    //发送消息
    AsyncEvent asyncEvent = new AsyncEvent("AsyncEvent");
    EventBus.getDefault().post(asyncEvent);
    Log.i("itheima", "post(asyncEvent);"+System.currentTimeMillis());
}
public void event4(View view) {
    //发送消息
    PostingEvent postingEvent = new PostingEvent("PostingEvent");
    EventBus.getDefault().post(postingEvent);
    Log.i("itheima", "post(postingEvent);"+System.currentTimeMillis());
}


三.接收消息

zaowu.itheima.com.eventbusdemo.demo2.ThreadModeActivity
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMainEvent(MainEvent event) {
    Log.i("itheima", "onMainEvent接收事件:"+event.getMsg()+Thread.currentThread()+":"+System.currentTimeMillis());
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onBackGroundEvent(BackGroundEvent event) {
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Log.i("itheima", "onBackGroundEvent接收事件:"+event.getMsg()+Thread.currentThread()+":"+System.currentTimeMillis());
}
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onAsyncEvent(AsyncEvent event) {
    Log.i("itheima", "AsyncEvent接收事件:"+event.getMsg()+Thread.currentThread()+":"+System.currentTimeMillis());
}
@Subscribe(threadMode = ThreadMode.POSTING)
public void onPostingEvent(PostingEvent event) {
    Log.i("itheima", "onPostingEvent接收事件:"+event.getMsg()+Thread.currentThread()+":"+System.currentTimeMillis());
}





运行结果【按点击顺序】


1】的运行结果为 ThreadMode.MAIN

2】的运行结果为ThreadMode.BACKGROUND

消息发送到接收到经过了10秒 且运行在子线程
3】的运行结果为ThreadMode.POSTING 与post在一个线程

【4】测试ThreadMode.ASYNC时按以下顺序
运行结果为

说明与ThreadMode.BACKGROUND都是子线程。但是如果后台有BACKGROUND在运行,ASYCN消息不会等待BACKGOUND完成,而是
直接运行。
【源代码下载地址】



1.8. 总结
有了EeventBus代码会更简洁。同时它比handler,广播,内容观察者的实现都简洁统一还支持消息接收的线程指定。
开发者重点掌握:ThreadMode变量




GIF演示EventBusDemo1.gif (34.51 KB, 下载次数: 45)

GIF演示EventBusDemo1.gif

作者: 翁志雄Gson    时间: 2016-5-10 20:59
近万人收藏的不错哦
作者: 杜杰老师    时间: 2016-5-10 22:02
精品
作者: sinbad88    时间: 2016-5-10 22:25
最近刚好研究这个呢
作者: yanwenyong    时间: 2016-5-11 09:50
不管什么先收藏一下
作者: 翁志雄Gson    时间: 2016-5-11 21:51
sinbad88 发表于 2016-5-10 22:25
最近刚好研究这个呢

项目中是否用到了?
作者: 翁志雄Gson    时间: 2016-5-11 21:52
yanwenyong 发表于 2016-5-11 09:50
不管什么先收藏一下

哈哈 把项目常用到提交过来。
作者: okchenyang44    时间: 2016-5-11 22:16
码要自己敲出来,也不能被视频限制了自己的思想,怎么想,就把想的转换为代码敲出来
作者: yanwenyong    时间: 2016-5-12 16:23
翁志雄Gson 发表于 2016-5-11 21:52
哈哈 把项目常用到提交过来。

作为新手想问一下什么情况下会用到这个,这个的优势是什么?
作者: sinbad88    时间: 2016-5-13 11:12
翁志雄Gson 发表于 2016-5-11 21:51
项目中是否用到了?

目前用到了RxJava
作者: Android_Robot    时间: 2016-5-13 17:39
签到!小伙伴们加油~ 需要资源的可以到站内资源库去取——2016年最耗心力的集大成之作 http://bbs.itheima.com/thread-300073-1-1.html

作者: Android_Robot    时间: 2016-5-13 17:54
引领移动互联网革命!像Google高级攻城狮一样,进军操作系统界,有的不止是高薪,更是能驾驭底层的精英—— let's Go! http://bbs.itheima.com/thread-300073-1-1.html

作者: sty15193    时间: 2016-5-13 21:20
游客,支持一下
作者: tuxj9091    时间: 2016-5-13 22:08
支持一下
作者: 爱上你的微笑    时间: 2016-5-13 23:56
必须收藏
作者: 天人之珠    时间: 2016-5-14 09:07
收藏的不错哦
作者: sty15193    时间: 2016-5-14 19:46
游客,支持一下
作者: mischen    时间: 2016-5-14 19:52
游客,支持一下也
作者: 幻影之舞    时间: 2016-5-14 21:11
收藏的不错哦
作者: 15102755269    时间: 2016-5-14 22:10
码了再说

作者: 不‰平凡℃    时间: 2016-5-14 22:14
收藏的不错哦
作者: chenxuzhong    时间: 2016-5-14 22:16
不错,我喜欢
作者: 黎贵福    时间: 2016-5-14 23:35
感谢楼主的分享,受用
作者: zhujunjie1994    时间: 2016-5-15 11:53
非常感谢!
作者: List    时间: 2016-5-15 17:50
感谢楼主,谢谢。
作者: scalar    时间: 2016-5-15 23:19
不错的分享,去github也关注下。
作者: 大海捞针    时间: 2016-5-16 22:30
收藏的不错哦
作者: 不‰平凡℃    时间: 2016-5-16 22:57
感谢楼主,谢谢
作者: 黑马_刘鹏    时间: 2016-5-17 17:44
精品
作者: 黑马_刘鹏    时间: 2016-5-17 17:44
精品
作者: sty15193    时间: 2016-5-17 21:34
感谢楼主
作者: deqiqi939788736    时间: 2016-5-18 08:27
赞一个,LZ,再接再历
作者: 15102755269    时间: 2016-5-18 21:40
每天都要来学习下

作者: 追忆睡梦已醒    时间: 2016-5-18 22:07
精品精品,谢谢分享。。。
作者: lxl962189096    时间: 2016-5-18 22:55
每天 都非常充实
作者: deqiqi939788736    时间: 2016-5-19 17:34
学习学习
作者: 清风幕竹    时间: 2016-5-19 23:38
精品 ,感谢楼主,谢谢
作者: chexinxin    时间: 2016-5-20 21:05
感谢愉快的分享
作者: 追风筝的少年    时间: 2016-5-20 23:14
感谢楼主的分享,楼主好人!
作者: 娶个英文名字    时间: 2016-5-21 00:56
目前还用不到。不过这几天来这里水贴好像还挺习惯的,资源确实多!
作者: longzonghai    时间: 2016-5-21 16:06
感谢愉快的分享
作者: 黑马1234    时间: 2016-5-21 19:46
不错  ,支持
作者: 清风幕竹    时间: 2016-5-21 22:06
来这里水贴的,资源确实多!
作者: ygxheima    时间: 2016-5-21 22:15
这里资源好多,发现了新大陆
作者: 开门的老人    时间: 2016-5-21 22:15
hello world
作者: nanliner    时间: 2016-5-21 22:28
这里的资源挺多的啊
作者: wendaogds    时间: 2016-5-21 22:31
收藏了,以后要用的,提前给自己上个保障
作者: HuaMuLan    时间: 2016-5-21 22:44
想学习的要果断收藏
作者: 琥珀    时间: 2016-5-21 23:47
感谢版主
作者: 翻滚吧!大牛!    时间: 2016-5-22 19:40
多谢楼主的分享
作者: pnchb    时间: 2016-5-22 21:10
多谢楼主的分享
作者: 我类个去    时间: 2016-5-23 22:07
好东西 仔细看看
作者: A20160580    时间: 2016-5-23 23:04
赶快赶快赶快
作者: wenge1215    时间: 2016-5-24 11:21
赶紧收藏,赞赞赞!
作者: es祖!    时间: 2016-5-24 17:16
收藏了,好东西!!当然要分享!
作者: kobe337    时间: 2016-5-24 17:57
看看!~~~~~~~~~~~~~~
作者: 妳的微笑    时间: 2016-5-24 18:48
大雄老师,讲的真好{:2_30:}
作者: longzonghai    时间: 2016-5-24 20:45
大键老师讲的真棒,赞一个
作者: loop    时间: 2016-5-24 22:16
6666666666

作者: 15102755269    时间: 2016-5-24 22:25
说的挺仔细的
作者: wenge1215    时间: 2016-5-25 10:10
收藏一下,慢慢学习!
作者: 383432651    时间: 2016-5-25 18:22
6666666666666666666666666
作者: hn347167359    时间: 2016-5-25 22:50
不知道再说啥
作者: 追风筝的少年    时间: 2016-5-25 23:43
收藏一下,慢慢学习
作者: chexinxin    时间: 2016-5-25 23:49
谢谢分享
作者: chexinxin    时间: 2016-5-25 23:50
比较全面的解析,阅读后一定会有收获,谢谢
作者: lizhenzhen    时间: 2016-5-26 00:23
听说eventBus在fragment之间进行通信时十分方便。还没来得及研究。楼主真是好人啊
作者: wangjingxuejava    时间: 2016-5-26 18:58
谢谢分享
作者: ZhengJingFeng    时间: 2016-5-26 20:58
楼主真是好人啊
作者: WemtFox    时间: 2016-5-26 23:40
谢谢分享,楼主真是好人啊
作者: 追风筝的少年    时间: 2016-5-26 23:57
世界上最真情的相依就是你在try我在catch,无论你发神马脾气,我都静静接受,默默处理!
作者: WOLAILE    时间: 2016-5-27 08:07
看看。                              
作者: HuaMuLan    时间: 2016-5-27 20:54
谢谢分享!收藏
作者: ZGL360    时间: 2016-5-27 22:30
古古怪怪ggggggwegs
作者: yangben    时间: 2016-5-27 22:35
赞,精品
作者: yourlike    时间: 2016-5-28 00:28
顶。。。。可惜还在基础
作者: zxjuzhu    时间: 2016-5-28 17:31
6666666666
作者: lizhoubin    时间: 2016-5-28 21:54
还在基础班 加油学习更多技术
作者: honcarry    时间: 2016-5-29 00:16
很好的东西,可惜现在还在基础班
作者: 李建立    时间: 2016-5-29 10:39
很好,不错,,,
作者: xuemingqiang    时间: 2016-5-29 11:16
还在基础班,正在努力学习更多的技术
作者: houdongyue    时间: 2016-5-29 22:19
很值得看看!!!!!
作者: 笔尖下的日子    时间: 2016-5-29 22:50
赞一个!!!!
作者: wby127889561    时间: 2016-5-30 22:03
还在基础班,正在努力学习更多的技术
作者: LVlong    时间: 2016-5-30 22:27
6666666666
作者: yourlike    时间: 2016-5-30 22:53
表示还看不懂
作者: 追忆睡梦已醒    时间: 2016-5-31 14:24
牛牛牛。。。。
作者: t450189661    时间: 2016-7-15 11:15
有了EeventBus代码会更简洁
作者: newu    时间: 2016-7-15 14:17
不错,真是太棒了!

作者: nba048    时间: 2016-7-17 23:44
1.EventBus3.0开发详解 近万开发者收藏 [修改]
作者: lcwooo    时间: 2016-7-22 15:39
近万人收藏的不错哦
作者: cell121    时间: 2016-7-31 10:22
最近刚好研究这个呢
作者: 萍水相逢    时间: 2016-8-4 08:58
EventBus有个致命的缺陷,就是使用后,在去看代码,不容易找到订阅者
作者: ztmkadaj    时间: 2016-8-6 17:19
学习学习

作者: a542524570    时间: 2016-8-20 00:41
45624444444444444
作者: silend    时间: 2016-8-22 09:27
正在学习
作者: laijun    时间: 2016-10-26 10:08
看一下源码,要找工作了TAT
作者: 继续敲代码    时间: 2017-1-16 11:28
谢谢分享
作者: 继续敲代码    时间: 2017-1-16 11:28
谢谢分享
作者: 等风来22    时间: 2017-1-24 11:14
谢谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2