写在前面

曾经我们做组件间的消息分发更新,通常会採用观察者模式。或者接口数据回调的相关方式,可是这种做法尽管能够解决我们的问题。可是组件之间的耦合相当严重,并且代码也不易阅读和维护,为了解决这种问题,我们能够使用消息总线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使用的简介的更多相关文章

  1. EventBus详解

    EventBus详解 简介 github原文 EventBus... * simplifies the communication between components - decouples eve ...

  2. Android 框架学习1:EventBus 3.0 的特点与如何使用

    前面总结了几篇基础,在这过程中看着别人分享自定义 View.架构或者源码分析,看起来比我写的"高大上"多了,内心也有点小波动. 但是自己的水平自己清楚,基础不扎实画再多源码流程图也 ...

  3. 安卓巴士android源码、博文精选1

      每周精选 第 53 期   精品源码 Android开源项目--CookMan 厨客APP     简介CookMan,厨客,是一款查询.搜索.分类.收藏菜谱功能的APP.|52数据来源Mob A ...

  4. 【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~

    一.写在前面 还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?EventBus 3.0,专注于android的发布.订阅事件总线,让各组件间的消息传递更简单!完美替代Intent,Handl ...

  5. Android EventBus 3.0.0 使用总结

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6039221.html 本文出自[赵彦军的博客] 前言 EventBus框架 EventBus是一个通用的叫法 ...

  6. 【转】GitHub 排名前 100 的安卓、iOS项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

  7. GitHub Android Libraries Top 100 简介

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过 ...

  8. 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

    排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...

  9. 64.GitHub 排名前100的android项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

随机推荐

  1. 易用的开源日志记录程序及其 .NET不用IIS实现预览站点工具

    原文发布时间为:2011-02-28 -- 来源于本人的百度文章 [由搬家工具导入] http://code.google.com/p/elmah/ (不需要改动任何的程序)、简单的配置(几行配置)、 ...

  2. js, lambada? 在chrome和node下可以使用

    var a=function(a,c){if(a)c(a)} undefined a(true,(console.log)) VM177:2 Uncaught TypeError: Illegal i ...

  3. Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分

    题目链接 题意 给定一个字符串(长度\(\leq 2e5\)),将其划分成尽量少的段,使得每段内重新排列后可以成为一个回文串. 题解 分析 每段内重新排列后是一个回文串\(\rightarrow\)该 ...

  4. Day 20 Object_oriented_programing(摘)

    面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...

  5. hdu 1492(约数的个数)

    The number of divisors(约数) about Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  6. Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】

    D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. 全局变量 全局函数vue 方法

    定义全局变量 原理: 设置一个专用的的全局变量模块文件,模块里面定义一些变量初始状态,用export default 暴露出去,在main.js里面使用Vue.prototype挂载到vue实例上面或 ...

  8. Vue中this.$router.push参数获取

    传递参数的方法:1.Params 由于动态路由也是传递params的,所以在 this.$router.push() 方法中path不能和params一起使用,否则params将无效.需要用name来 ...

  9. Unique Binary Search Trees II - LeetCode

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  10. IDEA阅读源码的技巧

    目录 1. 查看当前类内容 2. 查看当前类的继承体系 3. 查看当前方法的调用链 本教程仅支持 MAC 系统下的 IDEA 开发工具,如果需要 Windows 对应的操作起自行替代相应快捷键即可. ...