EventBus3.0的使用

Android EventBus3.0实例使用详解及封装调用 EventBus是使用十分广泛的事件总线框架, 2.0到3.0的变化还是挺大的 今天准备重构代码,关于解耦想到了用EventBus,发现EventBus出了3.0的beta版,使用方式略有区别,特此记录。如果不会用EventBus的,请参考教程。 3.0与2.x的区别 主要区别在订阅函数的不同 EventBus2.x中只暴露了四个方法供用户调用,分别是 onEvent 阅读详情

1、EventBus

http://greenrobot.org/eventbus/documentation/官方学习文档
http://greenrobot.org/
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。

在实际开发中经常遇到这样情况
1、activity之间传递数据
2、activity与fragment,fragment与fragment之间传递数据
3、activity与service之间传递数据
4、activiity与broadcast之间传递数据

如果按照android api可能要写很多代码,有时候还要携带context对象,并且很多时间传递给activity后要刷新ui。eventbus帮我们做了大量的这样的工作,代码简介,使用订阅/发布。

这里写图片描述

EventBus属于greenrobot出品,被收录google Guava库,Guava库有很多强大好用的东西

com.google.common.annotations 
com.google.common.base 
com.google.common.base.internal 
com.google.common.cache 
com.google.common.collect 
com.google.common.eventbus 
com.google.common.io 
com.google.common.net 
com.google.common.primitives 
com.google.common.util.concurrent 

在当前流行的retrofit(okhttp)网络库,不仅支持rxjava,java8,还有就是guava库,可以学习一下。

另外greenrobot出口另一个greendao数据库项目也非常好用
在项目中使用eventbus+greendao非常方便

eventbus 使用依赖

 compile 'de.greenrobot:eventbus:3.0.0-beta1'

2、EventBus的使用

1、订阅

订阅就是需要接收方,好像的们订阅的报纸,当有了报纸的时候,快递员就会向我们订阅方送报。比如在这是MainActivity了订阅方。
在这里主要做两件事
一是订阅注册,与取消

  @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);
    }

二是订阅事件
就是当订阅发布后,我们在这里做出相应的事件,比如接收数据,更新UI,或者做其他处理。
在这收到发布的信息后,在主线程中设置textview的值,弹出Toast。

  //收到ObjActivity中的数据
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void myEventBusObj(MyEvent myEvent) {
        text.setText(myEvent.getStr());
        Toast.makeText(this, myEvent.getStr(), Toast.LENGTH_SHORT).show();
    }

2、发布

public class ObjActivity extends AppCompatActivity {
    private Button btn_send;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_obj);
        btn_send= (Button) findViewById(R.id.send_obj);
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new MyEvent("222"));
            }
        });
    }
}

通过MyEvent类发送,也可以简单的只发送一条Message。

public class MyEvent {
    private String str;

    public MyEvent(String str){
        this.str=str;
    }

    public String getStr() {
        return str;
    }
}

3、示例

这里写图片描述

在MainActivity中为订阅者,注册事件,接收事件

package com.example.eventbus;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import de.greenrobot.event.EventBus;
import de.greenrobot.event.Subscribe;
import de.greenrobot.event.ThreadMode;
import event.MyEvent;
import event.PersonEvent;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_str;
    private Button btn_obj;
    private Button btn_person;
    private TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
        btn_str = (Button) findViewById(R.id.btn_str);
        btn_obj= (Button) findViewById(R.id.btn_obj);
        btn_person= (Button) findViewById(R.id.btn_person);
        text = (TextView) findViewById(R.id.text);
        btn_str.setOnClickListener(this);
        btn_obj.setOnClickListener(this);
        btn_person.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        Intent intent;
        switch (view.getId()) {
            case R.id.btn_str:
                intent = new Intent();
                intent.setClass(MainActivity.this, StrActivity.class);
                startActivity(intent);
                break;
            case R.id.btn_obj:
                intent = new Intent();
                intent.setClass(MainActivity.this, ObjActivity.class);
                startActivity(intent);
                break;
            case R.id.btn_person:
                intent = new Intent();
                intent.setClass(MainActivity.this, PersonActivity.class);
                startActivity(intent);
                break;
        }
    }


    //收到StrActivity中的字符串数据
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void myEventBusStr(String message) {
        text.setText(message + "");
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
    //收到ObjActivity中的数据
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void myEventBusObj(MyEvent myEvent) {
        text.setText(myEvent.getStr());
        Toast.makeText(this, myEvent.getStr(), Toast.LENGTH_SHORT).show();
    }

    //收到PersonActivity中的的person对象
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void myEventBusPerson(PersonEvent event) {
        text.setText(event.getPerson().getName()+event.getPerson().getAge());
        Toast.makeText(this,event.getPerson().getName()+event.getPerson().getAge(), Toast.LENGTH_SHORT).show();
    }


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

}

第一个ObjActivity,向MainActivity发送MyEvent对象

public class ObjActivity extends AppCompatActivity {
    private Button btn_send;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_obj);
        btn_send= (Button) findViewById(R.id.send_obj);
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new MyEvent("222"));
            }
        });
    }
}

PersonActivity向MainActivity发送PersonEvent,携带Psrson对象。

public class PersonActivity extends AppCompatActivity {
    private Button btn_person;
    private Person person;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_person);
        btn_person= (Button) findViewById(R.id.send_person);
        person=new Person();
        person.setName("tom");
        person.setAge("20");
        btn_person.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new PersonEvent(person));
            }
        });
    }
}

4、订阅事件线程处理

1、ThreadMode: POSTING

默认为在发送线程执行,推荐使用,这样ThreadMode开销最少,避免线程切换。因此,简单的任务,已经完成时间短,不
需要要线程的

// Called in the same thread (default)
// ThreadMode is optional here
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
    log(event.message);
}

2、ThreadMode: MAIN主线程

使用些模式,在主线程中,可以刷新UI

// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}

3、ThreadMode: BACKGROUND后台线程

// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
    saveToDisk(event.message);
}

4、ThreadMode: ASYNC异步线程

事件处理在一个特殊的线程中处理,并且是一些耗时的操作,比如网络请求数据,数据库查询等。

// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
    backend.send(event.message);
}

5、EventBus运行速度提升

EventBus提升,EventBus3.0使用注解方式,我们都知道注解是基于反射,反射在运行时期获取,一般是普通创建java对象的2倍,但为什么效率会提升呢。
EventBus使用的是编译时期注解,注解分两种,一种是编译时期,另一个是运行时期。在而EventBus是在编译时期的注解,这种注解并不会基于反射动态创建,和Butterknife一样,它生成的代码于普通创建对象一样。

删除结点 对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点。 1 由键盘输入值,换行表示输入结束,根据输入建立单链表。 2 输入链表中的一个元素值,从链表中删除这个元素的前驱结点。 3 对删除元素后的链表元素在屏幕上显示。 测试用例1 11 22 33 44 55 66 77↵ 44↵ 期待输出1 11 22 44 55 66 77↵ #include <iostre... 阅读详情

相关推荐

UDS服务应该支持哪些否定响应码

UDS服务应该支持哪些否定响应码所有服务都需支持的否定响应码具体的服务需要支持的否定响应码否定响应码定义及其取值 USD诊断服务的否定响应中包含有导致否定响应原因的编码,称为否定响应码(NRC, Negative Response Code)。否定响应码的取值范围为0x00 - 0xFF,被分为三组: 0x00:服务器内部实现否定响应码判断逻辑时使用,表示要给出肯定响应。 0x01 – 0x7F:诊断通信相关的否定响应码。 0x80 – 0xFF:服务器收到诊断服务请求时,由于某些条件不满足要求而给出的否定

闲聊汽车软件开发 4万+

Android EventBus在Activity、Fragment、Service中的使用

Android EventBus在Activity、Fragment、Service中的使用

weixin_42602900的博客 1043

什么是PON(无源光纤网络)、PON的发展及演进

全球知名媒体Omdia在光纤和铜缆接入设备预测报告中对2022年2月的预测显示,PON设备端口收入预计在2020年至2027年期间以12.3%的年复合增长率增长,到2027年将达到163亿美元,远高于2020年的82亿美元。 此前,Omdia有份报告称,在3月份举行的美国OFC展会中,众多 CSP 正在顺利部署 XGS PON(10G 对称),其他 CSP 专注于基于 GPON 的低速 FTTH 服务。另外关于25G PON 和 50G PON 之间的争论仍在继续,而Omdia 认为 25G PON 和 5

4929

Android Service后台下载 广播(Eventbus)通知并展示

因为好多项目都会用到比如后台下载apk,下载图片,音视频,这个时候就需要我们用Service进行后台下载了,首先讲一下我的思路一个简单的service后台图片下载展示,我需要创建一个service并注册注意不要忘记注册 在service里面重写onCreate开启一个工作线程做耗时工作 @Override public void onCreate() { // 开启一个工作线程做耗时工作 HandlerThread thread = newHandlerThrea

王鑫林的博客 950

基于gem5模拟trace的cache模拟器的实现

在做计算机体系结构的时候,模拟器是一个重要且又有效的工具。其中gem5集成了gem和m5的优点,使用起来比较简单和方便。其中包括了se模式和fs模式,se模式是在gem5运行我们已经编译好的程序,可以获取cache,cpu状态等数据,fs模式下可以模拟操作系统,我们可以将我们自己修改的linux内核加载到哥们上运行。下面介绍了使用gem5的se模式,运行编译好的ARM可执行文件。获取访存的trac

gaoxiang的专栏 8891

使用 ANSYS AEDT(双向耦合)对高功率射频同轴滤波器进行热分析

使用 ANSYS HFSS,可以精确计算 EM 损耗,然后将其导入 ANSYS 热分析并使用 ANSYS Icepak CFD 求解器进行仿真,以帮助工程师解决最复杂的热挑战,并预测其设计在温度变化下的表现。然后,RF 损耗将与 ANSYS Icepak CFD 求解器耦合,以执行热分析,包括传热的传导、对流和辐射模式,并计算温度曲线。在此演示中,我们将仿真下面的 RF 同轴滤波器,并计算由于所用材料的有限电导率和介电损耗而导致的 RF 传导损耗。设置 HFSS 设计后,我们可以开始 HFSS 仿真。

jkh920184196的博客 1050

Android EventBus的简单使用

Activity与Service之间的通信(组件之间的通信) 1、Activity 绑定Service形式 2、使用BroadcastReceiver通信 3、定义interface进行回调 4、使用EventBus通信: EventBus是一个事件订阅/发布模型,用以简化Android内部组件之间的数据通信。 Android Studio中

woliuyunyicai的专栏 1152

SE模块理解+SE-Resnet模块pytorch实现

文章目录SE模块理解SE实现注意力机制原因SE-resnet网络pytorch实现定义residual定义SE模块 SE模块理解 SENet是Squeeze-and-Excitation Networks的简称,拿到了ImageNet2017分类比赛冠军,其效果得到了认可,其提出的SE模块思想简单,易于实现,并且很容易可以加载到现有的网络模型框架中。SENet主要是学习了channel之间的相关性,筛选出了针对通道的注意力,稍微增加了一点计算量,但是效果比较好。 SE模块广泛应用于去噪,去雨方向,利用SE模

qq_42754919的博客 2万+

Activity与Service通信之EventBus

一、导包: compile 'org.simple:androideventbus:1.0.5' 二、在Activity和Service分别注册EventBus //注册EventBuseventBus = EventBus.getDefault();eventBus.register(this); 在onDestroy()注销EventBus @Overrideprotec

ABang的博客 8108

Arduino ESP32S3 基础入门教学大纲

ESP32环境、Arduino

追梦 3545

如何使用Google Maps API爬取地理数据:详细教程与Python实现

Google Maps API 是一组服务的集合,允许开发者访问地图、地点、路线等地理信息。:将地址转换为地理坐标,或将地理坐标转换为地址。:计算两点之间的行车路线、步行路线等。Places API:获取附近的地点、商店、餐馆等。:计算多个地点之间的距离和时间。在接下来的代码中,我们将结合这些 API,展示如何获取并处理地理数据。本文详细介绍了如何使用 Google Maps API 获取地理数据,涵盖了从地址转经纬度、获取地点详情、计算路线、计算多个地点的距离与时间等多个功能。

2201_76125261的博客 733

EventBus 详细使用教程[在Activity、Service、Receiver中Post](精简版)

原文地址 添加EventBus compile 'de.greenrobot:eventbus:2.4.0'11 或 直接下载jar包 |点击下载 注册和注销EventBus @Override protected void onStart() { super.onStart(); //注册

航天飞哥的博客 974

多尺度仿真软件:Copasi_(1).Copasi概述

Copasi(Complex Pathway Simulator)是一款开源的多尺度仿真软件,专为生物化学、系统生物学和合成生物学领域的研究人员设计。它不仅能够模拟细胞内和细胞间的生化反应网络,还能处理代谢途径、信号传导途径和基因调控网络等多种复杂系统。Copasi提供了用户友好的图形界面和强大的命令行接口,支持多种仿真算法和分析工具,使用户能够高效地进行模型构建、仿真和分析。Copasi允许用户创建自定义报告,以便生成特定格式的仿真结果。用户可以通过图形界面或命令行创建自定义报告。

kkchenjj的博客 857

EventBus 3.0 的使用

EventBus在github的地址:https://github.com/greenrobot/EventBus   一、 发送普通的消息的话 可以这样                   注意:EventBus.getDefault().post(new ClassEvent());  接受消息的activity、fragment等必须先注册了,然后再post消息,然后才能得到消息。

hrklzwzj的博客 2126

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

EventBus 3.0使用

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。发布者为GreenRobot公司。

陆羽_ 的简单生活 442

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Eventbus3.0简单使用

1.介绍         首先,来简单的收一下Eventbus,它是一种专门针对Android优化的发布/订阅事件总线。简化了应用程序和各个组件之间与线程之间的通信。优点是开销小,代码少以及将发送者和接受者解耦。如果Activity与Activity之间互相交互的话还好一些,如果说Fragment和Fragment之间交互非常让人头痛,我们有可能会使用广播来处理,或者是setArguments(

南城一点风雨的博客 523

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

EventBus3.0——索引的使用

EventBus3.0——索引的使用 相信对于索引这个词大家不会陌生,很多地方都有用到,那么为什么EventBus会引进索引这个东西,大家都知道EventBus的功能是通过反射机制获取观察者(订阅者)方法来实现的,而反射本身对性能的损耗比起一般的方法来说要大很多,具体慢多少,你们可以写一个程序测试下,大概50倍左右(当然对于CPU的运行速度,没有你想象中夸张)。

会飞的鱼~的博客 3211

EventBus3.0使用及源码解析

EventBus3.0使用EventBus3.0官方使用文档 EventBus3.0GitHub地址 在EventBus3.0的官方文档中,我们可以从下面几个步骤去使用EventBus来实现事件响应机制。 上图是官方的角色协作图,可以看出EventBus有一下几个角色 Event :传递的事件对象 Subscriber : 事件的订阅者 Publisher : 事件的发布者 Thread

Bug不知所起,一往而深。 552

Android消息传递之EventBus 3.0使用详解

Android消息传递之EventBus 3.0使用详解

lywfmt的博客 246

EventBus 3.0使用基础

EventBus 3.0使用基础EventBus概述 EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。1、下载EventBus compile 'org.greenrobot:eventbus:3

503

EventBus3.0.0的使用

1.添加依赖 compile 'org.greenrobot:eventbus:3.0.0' 2.自定义事件类,并提供构造方法以及get方法 public class SecondEvent { public String mMsg; public SecondEvent(String mMsg) { this.mMsg = mMsg; }

K2514091675的博客 542

EventBus3.0 使用详解(一)

*.EventBus的github地址:https://github.com/greenrobot/EventBus *.EventBus的官方网站:http://greenrobot.org/eventbus/ *.EventBus的官方文档:http://greenrobot.org/files/eventbus/javadoc/3.0/ 基于EventBus 3.0的使用方法:

koosol的专栏 8512

EventBus的使用(基于EventBus3.0,开发必备)

EventBus3的使用(基于EventBus3.0事件总线,开发必备)               很久没有写博客了,之前工作太忙了,好了,这次给大家带来Android开发中使用非常普遍,非常重要的开源框架EventBus(别名:事件总线); 这是一个github上面非常出名的开源项目,地址:点击打开链接查看EventBus             下面是官方介绍,这里我先截个图,然后详解

七号公园的博客 5755

30分钟学会EventBus3 0详解(二)(EventBus3 0的详细使用)(by星空武哥)

30分钟学会EventBus3 0详解(二)(EventBus3 0的详细使用)(by星空武哥)

qq_44934581的博客 175

eventbus的使用(三)简洁易懂--EventBus3.0,如何使用annotationProcessor生成索引类

eventbus可以让我们在不同的页面不同的组件之间传递消息。接下来介绍一下如何使用1、导入eventbus 在gradle里面配置compile 'org.greenrobot:eventbus:3.0.0'在同一个activity里: 1、在创建页面的时候注册eventbus 2、在销毁页面的时候注销eventbus 3、使用eventbus.post发送消息 4、消息是一个Objec

秦时明月 763

android eventbus fragment,EventBus3.0Fragment中使用的问题

前言:最近使用项目中使用EventBus,其中有一个Activity中使用ViewPager加载三个Fragment,由于存在传值的需求,并没有采用直接getActivity强转get的方式,而是采用EventBus3.0出现的问题:当前的B Activity获取到上个A Activity传过来的值,B Activity加载了三个Fragment a b c,Fragment中注册EventBus...

weixin_29197835的博客 799
上一篇: java内存区域与内存异常(jvm学习)
下一篇: popwindow+listview
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值