EventBus使用的简介
写在前面
曾经我们做组件间的消息分发更新,通常会採用观察者模式。或者接口数据回调的相关方式,可是这种做法尽管能够解决我们的问题。可是组件之间的耦合相当严重,并且代码也不易阅读和维护,为了解决这种问题,我们能够使用消息总线EventBus框架。
EventBus是一款针对Android优化的公布/订阅事件总线。主要特点例如以下:替代Intent,Handler,broadcast在Fragment。Activity。Service。线程之间传递消息。开销小,代码优雅,以及将发送者和接受者解耦。
开源地址:https://github.com/greenrobot/EventBus
EventBus简单使用方式(官网给的3步走,我这里细分了5步):
- 1、项目增加依赖。在项目中的build.gradle中增加以下代码:
compile 'org.greenrobot:eventbus:3.0.0'
- 2、定义消息事件对象
public class MessageEventOne {
public final String message;
public MessageEventOne(String message) {
this.message = message;
}
}
- 3、订阅者注冊到EventBUs以及配置事件接受方法
EventBus.getDefault().register(this);
//Declare your subscribing method:
@Subscribe
public void onEvent(AnyEventType event) {/* Do something */};
- 4、公布这发送消息
EventBus.getDefault().post(new MessageEventOne("Hello everyone!"));
- 5、反注冊EventBus
//这个是官网给的反注冊在stop方法中
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
//依据自己的须要,这里我的这个demo中使用的是
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
好了。既然有了以上的五步实现方式,那么我们就简单的实现以下吧:
在这里首先提示一点。例如以下图:
看下代码MainActivity.java:
package com.example.eventbusdemo;
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 android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
//import de.greenrobot.event.EventBus;
public class MainActivity extends AppCompatActivity {
private Button mButton1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
mButton1 = (Button) findViewById(R.id.button1);
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
});
}
/*@Subscribe
public void onMessageEvent(MessageEventOne event) {
Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show();
}*/
/**
* 该方法会在UI线程中运行,接受事件同一时候会在UI线程中运行。这样我们能够在改方法中直接更新UI
*
* @param event
*/
@Subscribe @Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEventOne event) {
Toast.makeText(this, "接收到消息:" + event.message, Toast.LENGTH_SHORT).show();
}
/*
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}*/
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
Main2Activity.java:
package com.example.eventbusdemo;
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;
//import de.greenrobot.event.EventBus;
public class Main2Activity extends AppCompatActivity {
private Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initialize();
}
private void initialize() {
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("wuyinlei", "Main2Activity当前线程" + Thread.currentThread()+toString());
EventBus.getDefault().post(new MessageEventOne("Hello everyone!"));
Main2Activity.this.finish();
}
});
}
}
布局代码就更简单了,就有一个button。在这里就不多说了
我们直接看下结果吧:
使用是不是非常easy哈,接下来我们来看下EventBus里面的几个ThreadMode:
POSTING
PostThread :默认的 ThreadMode,表示在运行 Post 操作的线程直接调用订阅者的事件响应方法,
不论该线程是否为主线程(UI 线程)。
当该线程为主线程时,响应方法中不能有耗时操作,
否则有卡主线程的风险。适用场景: 对于是否在主线程运行无要求,但若 Post 线程为主线程。
不能耗时的操作 ;
MAIN
MainThread :在主线程中运行响应方法。假设公布线程就是主线程,则直接调用订阅者的事件响应方法,
否则通过主线程的 Handler 发送消息在主线程中处理——调用订阅者的事件响应函数。
显然。
MainThread 类的方法也不能有耗时操作,以避免卡主线程。
适用场景: 必须在主线程运行的操作 。
BACKGROUND
BackgroundThread :在后台线程中运行响应方法。
假设公布线程 不是 主线程,则直接调用订阅者的
事件响应函数,否则启动 唯一的 后台线程去处理。由于后台线程是唯一的,当事件超过一个的时候。
它们会被放在队列中依次运行,因此该类响应方法尽管没有 PostThread 类和 MainThread 类方法
对性能敏感。但最好不要有重度耗时的操作或太频繁的轻度耗时操作。以造成其它操作等待。适用场景:
操作轻微耗时且不会过于频繁 。即一般的耗时操作都能够放在这里;
ASYNC
Async :不论公布线程是否为主线程,都使用一个空暇线程来处理。和 BackgroundThread 不同的是
, Async 类的全部线程是相互独立的,因此不会出现卡线程的问题。适用场景: 长耗时操作,
比如网络訪问 。
我也试过了。仅仅要指定ThreadMode,方法名字能够自定义的。以下我们来看下怎么使用吧。
我们首先来看下怎么区分是谁发送的消息,这个时候我们在定义一个消息事件对象:
public class MessageEventTwo {
public final String message;
public MessageEventTwo(String message) {
this.message = message;
}
}
我们在Main2Activity中增加一个button。来測试一下:
button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEventTwo("我是第二个消息"));
Main2Activity.this.finish();
}
});
我们来看下运行结果:
能够看到。消息传递是不会混乱的。为什么呢,由于我们在接受消息的时候,已经指定了消息事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEventOne event) {
Toast.makeText(this, "接收到消息:" + event.message, Toast.LENGTH_SHORT).show();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEventTwo event) {
Toast.makeText(this, "接收到消息:" + event.message, Toast.LENGTH_SHORT).show();
}
在这里说一点,假设没有在接受消息方法上指定,那就是默认的模式,就是在post消息的线程中处理(我刚開始没有指定,測试其它几个的时候,都是在post线程中。找了好久也不知道,最后看了源代码知道了这几个模式 )
@Subscribe(threadMode = ThreadMode.MAIN)还有其它的模式
好了。我们来看下其它几种模式:
/**
* 使用该方法作为订阅函数表示post消息事件和接受消息事件在同一个线程中
*
* @param event
*/
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEvent(MessageEventOne event) {
Log.d("wuyinlei", "onEvent当前线程" + Thread.currentThread() + toString());
//Toast.makeText(this, "接收到消息onEvent:" + event.message, Toast.LENGTH_SHORT).show();
}
/**
* 使用该方法,假设事件在UI线程中发出来。该方法会在子线程中运行,假设是从子线程中发出来消息,该方法会在子线程中运行
*
* @param event
*/
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventBackgroundThread(MessageEventOne event) {
Log.d("wuyinlei", "onEventBackgroundThread当前线程" + Thread.currentThread() + toString());
// Toast.makeText(this, "接收到消息onEvent:" + event.message, Toast.LENGTH_SHORT).show();
}
/**
* 使用该方法,会在创建新的子线程中运行
*
* @param event
*/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void Async(MessageEventOne event) {
Log.d("wuyinlei", "onEventAsync当前线程" + Thread.currentThread() + toString());
// Toast.makeText(this, "接收到消息onEvent:" + event.message, Toast.LENGTH_SHORT).show();
}
我们来看下log打印吧:
好了,假设想要了解的很多其它,能够去看下源代码哈,假设有问题或者疑问或者见解,能够QQ:1069584784
EventBus使用的简介的更多相关文章
- EventBus详解
EventBus详解 简介 github原文 EventBus... * simplifies the communication between components - decouples eve ...
- Android 框架学习1:EventBus 3.0 的特点与如何使用
前面总结了几篇基础,在这过程中看着别人分享自定义 View.架构或者源码分析,看起来比我写的"高大上"多了,内心也有点小波动. 但是自己的水平自己清楚,基础不扎实画再多源码流程图也 ...
- 安卓巴士android源码、博文精选1
每周精选 第 53 期 精品源码 Android开源项目--CookMan 厨客APP 简介CookMan,厨客,是一款查询.搜索.分类.收藏菜谱功能的APP.|52数据来源Mob A ...
- 【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~
一.写在前面 还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?EventBus 3.0,专注于android的发布.订阅事件总线,让各组件间的消息传递更简单!完美替代Intent,Handl ...
- Android EventBus 3.0.0 使用总结
转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6039221.html 本文出自[赵彦军的博客] 前言 EventBus框架 EventBus是一个通用的叫法 ...
- 【转】GitHub 排名前 100 的安卓、iOS项目简介
GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...
- GitHub Android Libraries Top 100 简介
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过 ...
- 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)
排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...
- 64.GitHub 排名前100的android项目简介
GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...
随机推荐
- NIO、AIO学习历程
今天我们以一个常见的面试题作为开始:"谈谈你对IO与NIO的理解".要回答这个问题,我们首先我要了解几个概念: NIO 同步+非阻塞 IO(BIO) 同步+阻塞 AIO 异步+非阻 ...
- java基于udp实现键盘录入聊天
发送端 package demo02; import java.io.IOException; import java.net.DatagramPacket; import java.net.Data ...
- python3 定义向量运算
from math import hypot #定义向量的构造方法 class Vector: def __init__(self,x=0,y=0): self.x=x; self.y=y; ''' ...
- 【原创】设置EXCEL2010打开多个独立窗口
最近发现一个奇怪的问题,发现office中的word和ppt在我使用笔记本分屏幕(双屏)的时候都可以将2份文档分别在2个窗口打开,但是在使用excel的时候却发现不行,最后研究发现原因 ...
- (一)python 简单网页爬虫
1.基于window环境,使用的工具是 Anaconda 下载地址 https://www.anaconda.com/download/ 2.所使用的包 BeautifulSoup,用来解析html代 ...
- C# ASP.NET中Process.Start没有反应也没有报错的解决方法
最近有一个很坑的需求,在ASP.NET中打开一个access,还要用process.start打开,调试时一切正常,到了发布后就没有反应,找了一下午,各种设文件夹权限也不行,最后把应用程序池改成管理员 ...
- 数据库索引实现原理—B_TREE
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B_TREE.B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据:相反 ...
- TopCoder SRM 301 Div2 Problem 1000 CorrectingParenthesization(区间DP)
题意 给定一个长度为偶数的字符串.这个字符串由三种括号组成. 现在要把这个字符串修改为一个符合括号完全匹配的字符串,改变一个括号的代价为$1$,求最小总代价. 区间DP.令$dp[i][j]$为把子 ...
- 洛谷——P3183 [HAOI2016]食物链
P3183 [HAOI2016]食物链 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形 ...
- 2016北京集训测试赛(十四)Problem A: 股神小L
Solution 考虑怎么卖最赚钱: 肯定是只卖不买啊(笑) 虽然说上面的想法很扯淡, 但它确实能给我们提供一种思路, 我们能不买就不买; 要买的时候就买最便宜的. 我们用一个优先队列来维护股票的价格 ...