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一样,它生成的代码于普通创建对象一样。

HEVC/VVC中R-Lambda码率控制算法原理 文章目录1. 比特分配1.1 GOP级比特分配1.2 帧级比特分配1.3 LCU级比特分配2. 码率控制2.1 λ的计算和更新2.2 参数QP的确定 VVC中码率控制算法沿用了HEVC中经典的R-λ码率控制模型,R-λ由中科大的李斌博士提出(详情参考JCTVC-K0103)。R-λ模型的基础为视频编码中 R(比特 bpp)和 D(失真 MSE)之间的双曲线模型,即 D(R)=CR−KD(R) = ... 阅读详情

相关推荐

避坑指南:Livox Mid-360双雷达SLAM配置中,那些官方文档没说的细节(IP设置、话题分离与时间同步)

本文详细解析了Livox Mid-360双雷达SLAM配置中的关键优化点,包括IP设置、话题分离与时间同步等官方文档未提及的细节。通过实战案例和代码示例,帮助开发者解决点云错位、IMU数据混乱等问题,提升SLAM系统的稳定性和精度。特别针对网络架构设计、驱动修改和时间同步机制提供了专业指导。

weixin_29745609的博客 425

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

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

weixin_42602900的博客 1043

使用STM输出互补SPWM波(三相各差120°)

使用STM32输出SPWM波形(三相各差120°)

hello011102的博客 7373

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

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

王鑫林的博客 950

走马观碑组智能车竞赛:目标板识别算法优化与实战技巧(基于OpenCV)

本文针对智能车竞赛走马观碑组别的核心挑战,深入探讨了基于OpenCV的目标板识别算法优化与实战技巧。文章系统分析了PVC赛道环境下的光照、运动模糊等干扰因素,详细拆解了从红色矩形定位、透视校正到特征提取与分类的完整流程,并提供了工程优化、速度提升及现场调试的实用策略,旨在帮助参赛队伍构建一套在高速运动中既准又快的鲁棒识别系统。

life6的博客 732

OpenHarmony实战开发-如何实现文件分布式同步编辑

在分布式文件场景中,分布式设备管理包含了分布式设备搜索、分布式设备列表弹窗、远端设备拉起三部分。首先在分布式组网内搜索设备,然后把设备展示到分布式设备列表弹窗中,最后根据用户的选择拉起远端设备。两台设备组网的分布式场景是工作中常常需要的。这样的分布式场景有助于加快工作效率,减少工作中的冗余,本例将为大家介绍如何实现上述功能。​ (2)订阅分布式数据变化:通过this.distributedObject.on(‘status’, this.statusCallback)监听分布式数据对象的变更。

2401_82546228的博客 751

Android EventBus的简单使用

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

woliuyunyicai的专栏 1152

【Unity报错】Unity导入海康SDK 报错 DllNotFoundException: PlayCtrl assembly

2.尝试按网上其他的办法(包括使用depengs查看dll依赖等)1.先检查Plugins文件夹中是否存在PlayCtrl文件。3.如果网上查阅的办法都不能解决,请继续往下看。更换低版本的SDK库文件。

weixin_42968584的博客 1126

Activity与Service通信之EventBus

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

ABang的博客 8108

跟着团子学SAP CO:基于成本的完工百分比结算:Cost-based POC(以项目为例)

本文以英国及北美会计准则下的基于成本的POC的销售型项目结算对PS模块中的完工百分比进行介绍

Lucas1211的博客 2万+

银河麒麟编译libjpeg库并配置qt环境

银河麒麟下编译libjpeg库并配置qt环境验证

小米的修行之路 1012

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

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

航天飞哥的博客 974

详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署

YOLO(You Only Look Once)系列算法因其高效、准确等特点而备受瞩目。由2023年Ultralytics公司发布了YOLO的最新版本YOLOv8是结合前几代YOLO的基础上的一个融合改进版。本文YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署,从网络结构的讲解从模型的网络结构讲解到模型的部署都有详细介绍,同时在本专栏中还包括YOLOv8模型系列的改进包括个人提出的创新点,传统卷积、注意力机制、损失函数的修改教程,能够帮助你的论文获得创新点。

Snu77的博客 8万+

EventBus 3.0 的使用

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

hrklzwzj的博客 2126

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

EventBus 3.0使用

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

陆羽_ 的简单生活 442

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Eventbus3.0简单使用

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

南城一点风雨的博客 523

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、付费专栏及课程。

余额充值