rxjava系列(三)-- rxjava在Android中的应用

Android中的RxJava 最近准备梳理一下Kotlin,先复习一遍RxJava思想,做个学习笔记+伪代码,整个脉络分为三个部分。 (一)使用场景 RxJava是重量级、最复杂的框架(没有之一),JakeWharton 的巅峰之作,操作符非常丰富、特别庞大,学关键的内容,学思维方式,看PPT资料,学两遍。 为什么要学习RxJava? 改变思维(Rx思维)来提升效率,响应式编程/异步事件流编程 Rx思维:起点(分发事件)—>…—>终点(消费事件),中间不会断掉且可以做拦截,链条式思维 学习资料 源码:JakeWhar. 阅读详情

这篇文章将介绍RxPermissions、ReactiveNetwork、RxBinding的使用

自从rxjava出现以来,Android领域出现了各种各样基于rxjava开源的库,有处理权限操作的RxPermissions、处理网络状态监听的ReactiveNetwork、处理事件绑定的RxBinding、处理蓝牙问题的RxAndroidBle 等等。

在介绍rxjava与Android相关的开源库之前,我们还需要了解rxjava另一个非常重要的概念。

Scheduler

在rxjava中,Scheduler相当于线程控制器,rxjava通过Scheduler来指定每一段代码应该运行在什么样的线程中。rxjava内置了几种Scheduler,我们先不去关心,这里我们只了解2中Scheduler:

  • AndroidSchedulers.mainThread(),Android专用的调度器,它指定的操作符将在Android主线程中运行;
  • Schedulers.io(),I/O操作(读写文件、读写数据库、网络信息交互等)所使用的Scheduler。行为模式和newThread()差不多,区别在于io()的内部实现是一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下io()比newThread()更有效率。不要把计算工作放在io()中,可以避免创建不必要的线程。

因此在Android中是用哪个rxjava系列库通常要引入rxandroid的依赖,当然一些第三方的rx库已经自己引入了rxandroid,具体看项目External Libraries中是否已经导入rxandroid包。


这里写图片描述

RxPermissions的使用

引入RxPermissions

compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'

相信对于Android开发人员来说,6.0带来的权限问题并不陌生。许多动态权限需要我们在编码过程中动态获取,然后在权限回调方法中进行相应的事件处理。相信很多开发者会因为权限问题带来的编码工作而烦恼,究竟如何使用、如何封装才是最佳的实现方式。RxPermissions可以很好的帮我们处理权限问题:

实例一
RxPermissions rxPermissions = new RxPermissions(this);
        rxPermissions.request(Manifest.permission.CAMERA)
                .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean aBoolean) {
                        if(aBoolean){
                            Toast.makeText(RxPermissionTestActivity.this,"您允许了相机权限",Toast.LENGTH_SHORT).show();
                        }else {
                            Toast.makeText(RxPermissionTestActivity.this,"您拒绝了相机权限",Toast.LENGTH_SHORT).show();
                        }
                    }
                });

非常简单,只需要在Activity或者Fragment初始化RxPermissions实例,然后调用其简单方法就可以实现动态权限的申请。mm再也不用担心权限问题带来的编码困扰了。简单说下,RxPermissions是通过创建透明Fragment进行其跟Activity的关联和生命周期的管理。


RxBinding使用

引入rxbinding

    compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'

rxbindview是用来帮助控件处理各种点击事件的开源库,并不提供控件初始化的功能。

实例二

这里的demo我们事先一个小功能,参考网上一个大神blog写的。一个listview,一个EditText,我们监听EditText中文字的输入来动态显示下面的列表,列表中数据根据输入框内容动态模糊查询:

mListView = (ListView) findViewById(R.id.listview);
final ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1);
        mListView.setAdapter(mAdapter);
        RxTextView.textChanges(mEditText)
                .debounce(600,TimeUnit.MILLISECONDS)
                .map(new Func1<CharSequence, String>(){//获取输入框内容
                    @Override
                    public String call(CharSequence charSequence) {
                        return charSequence.toString();
                    }
                })
                .observeOn(Schedulers.io())//转换线程
                .map(new Func1<String, List<String>>() {
                    @Override
                    public List<String> call(String str) {
                        List<String> dataList = new ArrayList<String>() ;
                        if ( ! TextUtils.isEmpty(str)){
                            for ( String s : getData()  ) {
                                if (s != null) {
                                    if (s.contains(str)) {
                                        dataList.add(s);
                                    }
                                }
                            }
                        }
                        return dataList ;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<String>>() {
                    @Override
                    public void call(List<String> strings) {
                        mAdapter.clear();
                        mAdapter.addAll( strings );
                        mAdapter.notifyDataSetChanged();
                    }
                });

可以看到,通过rxbing的RxTextView的textChanges()我们就可以实现输入框文本内容变化的监听,这里设置文本变化600ms后执行map操作符获取到文本框输入的文本,然后将事件转向I/O操作中(类似去网络请求),接下来map中的事件将在I/O线程中进行(过滤数据,只显示包含输入框输入字符串的字符串列表),之后又将事件转向Android主线程执行,也就是最后的观察者事件在主线程中执行,通知adapter列表数据的变化。其中getData()方法就是模拟一组数据

private List<String> getData(){

        List<String> strs = new ArrayList<>();
        strs.add("12");
        strs.add("123");
        strs.add("1234");

        return strs;
    }
实例三

下面的demo将实现这样一个功能,通过rxbinding和rxPermissions的结合,实现button点击事件过程中,确保点击button时候要求的相机运行时权限已被申请的前提下才去执行具体的点击事件

RxView.clicks(mButton)
                .compose(rxPermissions.ensure(Manifest.permission.CAMERA))
                .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean aBoolean) {
                        if(aBoolean)
                            Toast.makeText(RxPermissionTestActivity.this,"您点击了按钮",Toast.LENGTH_SHORT).show();
                    }
                });
    }
实例四

这个demo实现一个按钮点击事件,2s内只允许执行一次点击事件方法,可以有效避免按钮被快速重复点击导致点击事件方法被频繁的重复调用

 RxView.clicks(button)
                .throttleFirst(2, TimeUnit.SECONDS)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void aVoid) {
                        Toast.makeText(RxBindingTestActivity.this,"单击事件",Toast.LENGTH_SHORT).show();
                    }
                });

ReactiveNetwork的使用

引入ReactiveNetwork:

compile 'com.github.pwittchen:reactivenetwork:0.9.1'
实例五

网络状态变化的监听也是项目中常用的一个功能,通常都是通过监听系统广播来实现网络状态变化的监听事件,ReactiveNetwork可以很好的帮助我们实现网络事件的监听

ReactiveNetwork.observeNetworkConnectivity(this)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Connectivity>() {
                    @Override
                    public void call(Connectivity connectivity) {
                        String connectStr = connectivity.toString();
                        mTextView.setText(connectStr);
                    }
               });

被观察者事件在I/O线程中实现网络事件监听,观察者事件在Android主线程中执行。当监听到网络状态变化的时候,通知观察者在主线程进行监听事件操作。这里返回的Connectivity对象包含了网络所有的状态信息。

实例六

还有更简单的实现网络是否连接的监听

ReactiveNetwork.observeInternetConnectivity()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean aBoolean) {
                        if(aBoolean)
                            Toast.makeText(ReactiveNetworkText.this,"网络可用",Toast.LENGTH_SHORT).show();
                        else
                            Toast.makeText(ReactiveNetworkText.this,"对不起,网络不可用",Toast.LENGTH_SHORT).show();
                    }
                });
    }

至此,rxjava有关的Android框架介绍完了。其实除了上面这几个,还有很多rx系列的Android开源库,有兴趣的同学可以自己去github上面了解。通过这几篇文章的介绍,相信你对rxjava有了较深入的理解,至于具体的使用以及功能的开发还需要我们具体在项目实战中去积累。

欢迎大家留言讨论,之后我将继续对rxjava和retrofit2的使用继续进行总结。

RxJava在Android开发中的10个实用场景 随着Android应用复杂度的提升,异步任务处理、UI事件响应、网络数据交互等场景对代码的可维护性和性能提出更高要求。RxJava作为响应式编程的经典实现,通过将异步操作转化为数据流处理,有效解决了传统回调带来的“回调地狱”问题。本文聚焦RxJava在Android开发中的实际应用,通过10个典型场景的深度解析,帮助开发者建立系统化的响应式编程思维,掌握从基础异步处理到复杂业务逻辑整合的全流程解决方案。 阅读详情

相关推荐

监听网络连接和信号库

源码ReactiveNetwork,ReactiveNetwork是一个监听网络连接状态与WiFi信号强度的库,使用RxJava Observable实现。RxJava 1.0.+ 与 RxAndroid 1.0.+,min sdk version = 9。

ReactiveNetwork 使用指南

ReactiveNetwork 是一个用于监听Android设备网络连接状态和互联网连通性的库,支持RxJava2。以下为该GitHub项目的基本目录结构概述: ```markdown ReactiveNetwork/ │ ├── app/ - 示例应用代码,包含了库的使用示例。 ├── build.gradle - 项目构建配置文件。 ├── R...

gitblog_01151的博客 501

编译原理(东南大学)一:【编译原理期末冲刺救命笔记】速存!看完再上考场稳了!

本文详细介绍了编译原理的核心概念和流程,包括程序设计语言的分类、编译程序的各个阶段(如词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成)以及编译程序生成和构造的基础知识。文章还探讨了编译中的表格管理、出错处理和遍的概念,以及编译基础知识如高级语言、语法规则、字母表和符号串的运算。此外,文中还涉及文法与语言的关系,包括文法的概念、非终结符、终结符、产生式、推导和规约等。整体内容旨在为学习编译原理的学生提供全面的复习资料和考试准备指南。

一位搞嵌入式和前端的genius的博客 1026

XQUIC性能优化实战:从零开始构建高性能QUIC应用的10个技巧

XQUIC是阿里巴巴开源的跨平台QUIC和HTTP/3协议实现,通过优化配置与参数调优,可显著提升网络传输性能。本文将分享10个实用技巧,帮助开发者从零开始构建高性能QUIC应用,充分发挥XQUIC的技术优势。 ## 1. 选择合适的拥塞控制算法 XQUIC支持多种拥塞控制算法,不同算法适用于不同网络场景: - **BBR/BBRv2**:适合长距离、高带宽网络,通过测量带宽和最小RTT实现高

gitblog_00005的博客 718

基于ESP32-WROOM的智能蓝牙电压电流监测与远程控制系统设计

本文介绍了基于ESP32-WROOM的智能蓝牙电压电流监测与远程控制系统设计。该系统集成了INA219传感器和OLED显示屏,通过蓝牙实现无线数据传输和远程控制,适用于智能家居能耗监控和工业设备管理,具有成本低、精度高、功耗优化等优点。

qsc901234的博客 203

微型纵向加密在新能源场站中的实战部署与运维避坑指南

本文详细解析了微型纵向加密在新能源场站中的实战部署与运维技巧。通过国密算法SM4实现数据加密,确保新能源场站通信安全,同时提供非侵入式部署方案和运维避坑指南,帮助提升网络稳定性和运维效率。

weixin_30505225的博客 595

推荐项目:ReactiveNetwork —— 优雅的Android网络连接监控方案

随着移动应用的日益普及,确保应用对网络状态的准确感知变得尤为重要。ReactiveNetwork,一个基于RxJava的Android库,以其响应式编程的魅力,为我们提供了一种监听网络连接状态和互联网连通性的强大工具。本文将带您深入了解这一神器,探索其技术精妙之处,应用场景以及独特特性,让您的应用在复杂多变的网络环境中游刃有余。 ## 项目介绍 ReactiveNetwork是[Network...

gitblog_00236的博客 424

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

机器学习深度学习业余选手 477

IBM超级计算机加持:Granite-3B-Code-Instruct-2K训练基础设施的完整解密指南

在人工智能代码生成领域,IBM的**Granite-3B-Code-Instruct-2K**模型以其卓越的性能和高效的训练架构脱颖而出。这款拥有30亿参数的代码生成模型,在HumanEvalSynthesis测试中Python代码生成准确率高达51.2%,这背后离不开IBM强大的超级计算基础设施支持。本文将深入解密这款模型的训练基础设施,揭示IBM如何利用先进的计算集群打造顶尖的代码生成AI。

gitblog_00877的博客 775

MyBatis-Plus 实战:敏感字段自动加解密支持模糊查询

本文基于MyBatis-Plus框架提出了一种全链路敏感字段加密方案。通过自定义TypeHandler实现数据入库自动加密和查询自动解密,结合重写LambdaQueryWrapper处理查询条件加密,并适配多种查询方式。方案核心包括:1)AESUtil工具类提供加解密基础能力;2)EncryptTypeHandler实现字段类型转换;3)实体类通过注解配置加密字段。该方案在保证数据安全的同时,对业务代码侵入性小,支持姓名、手机号等敏感信息的全流程加密处理,满足系统开发的安全需求。

蔡定努 595

【感知模块算法】障碍物detect+trace+prediction方向介绍

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、多维度看感知问题,体会复杂性二、障碍物/环境目标detect方向1.视觉目标检测方向(1)图像处理认知(2)视觉基础理论部分1、获取数据集---python网页爬虫、买数据、自己录数据、使用开源比赛的数据集2、opencv库的学习3、深度学习框架学习(3)视觉目标检测理论(1)目标检测的概念(2)目标检测的应用场景(3)现有目标检测框架原理及论文【这仅仅是我当初入门学习的框架~

qq_35635374的博客 2893

RxJava在Android中的应用

将 RxJava 与 MVP 或 MVVM 架构结合使用,是现代 Android(以及 Java Swing)开发中的最佳实践之一。这种结合能充分发挥各自的优势:架构模式负责清晰的职责分离和可测试性,而 RxJava 则优雅地处理异步、事件流和复杂的线程切换。MVP 的核心思想是将 Activity/Fragment (View) 从繁重的业务逻辑中解放出来,使其只负责 UI 的展示和用户交互的传递。) 设置全局错误处理器。merge 合并多个 Observable 的数据,按时间顺序发射,可能交错。

csdn_silent的博客 1152

2022中山大学计算机技术专硕考研初试、复试经验帖

个人简介 推荐几个我自己感觉对考研非常有帮助的小助手吧。可以帮助节省时间! 考研时间规划总览 初试篇 数学 英语 政治 408 复试篇 机试 笔试 面试 关于选导师 个人感言

zik的博客 1万+

从零开始的RxJava2.0教程(四)在安卓中的应用

1. 前言在第1 2 3篇中,我介绍了RxJava 2.0的基本用法。这一篇将介绍在安卓中的基本用法。 附上本系列教程的链接。 从零开始的RxJava2.0教程(一)基础 从零开始的RxJava2.0教程(二)操作符 从零开始的RxJava2.0教程(三)响应式的好处2. RxAndroidRxAndroid是RxJava针对Android平台的扩展库。曾几何时,RxAndroid确实提供了

宇不语的博客 1万+

【深度学习|Transformer模型学习】什么是前馈神经网络(Feed-Forward Neural Network)?将前馈神经网络中的全连接层变成1*1卷积层会有什么样的效果?

【深度学习|Transformer模型学习】什么是前馈神经网络(Feed-Forward Neural Network)?将前馈神经网络中的全连接层变成1*1卷积层会有什么样的效果?

985小水博的摸鱼日常 1374

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RxJava在Android中的使用详解

本文详细讲解Rxjava在Android中的原理,技术及应用。比较简单(本文转载于RxJava在Android中的使用)。 前言 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 。而最近这几个月,我也发现国内越来越多的人开始提及 RxJava 。有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是

AndyYuan317的博客 3222

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

对RxJava在Android开发中的应用了解

RxJava是一种非常强大的编程工具,它基于响应式编程思想,提供了一种新的编程范式,能够更加简洁、优雅地处理事件流和数据流。在Android开发中,RxJava广泛应用于异步操作、事件处理和数据流管理等方面,极大地提升了代码的可读性和易维护性。同时,RxJava提供了丰富的操作符和调度器,使得开发者可以灵活地控制线程和数据流。然而,RxJava也存在一些局限,如学习曲线较陡、代码可能冗长等。因此,在使用RxJava时,需要权衡其优势和局限,根据具体项目的需求来选择合适的工具和技术。

Good_tea_h的博客 1223

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

安卓进阶——RxJava

RxJava是由Netflix开发的响应式编程框架,基于观察者模式简化异步编程。核心组件包括Observable(数据发射源)、Observer(数据处理者)、Subject(双向桥梁)和Subscription(订阅管理)。框架提供创建、转换、过滤、组合等丰富操作符,支持线程调度控制(如subscribeOn/observeOn)。典型应用场景包括网络请求链式调用、UI事件防抖、生命周期管理等。需注意内存泄漏防护(CompositeDisposable)、合理选择操作符及错误处理机制。其流式...

Meteors.的博客 1200

Android面试神器之Rxjava破冰

前言 刚参加工作的时候接触到了项目中的Rxjava,当时一点基础没有,学习了好长时间才渐渐学会使用,但也只是皮毛,停留在表面。后来换工作了发现Rxjava对找工作的帮助还是挺大的,因为是流行框架,都可以讲给面试官听,体现出自己追求技术的精神。但实际上,学会Rxjava对技术的提升还是很有帮助的,所以我会为大家讲解Rxjava的相关知识,以及Rxjava 1 到Rxjava 2的变化,帮助大...

风花散却隽世间,雪月寥落化雨田 1万+

安卓异步框架RxJava

安卓异步框架RxJava

似霰的博客 2660

如何使用RxJava 2.x开发Android应用?

在介绍反应式编程之前,我们首先了解一种反应性较弱的平台:Adobe Flash。在被Adobe收购之前,Macromedia构建了一个名为Flex的成熟框架(后来被称为Apache Flex)。Flex中的一个重要概念是每个呈现组件的setData函数。setData函数的作用是接收一个数据对象,它完全包含组件需要呈现的信息。尽管一直没有完全弄清楚如何在原始源和组件预期接收的内容之间转换数据,但我从年轻时就一直致力于编写灵活的DirectX C++代码,这是一个很好的关注点分离。 ...

清图出版 3349

【Android】RxJava系列01-基本概述和基本用法

1.RxJava的概述2.RxJava的作用3.观察者和被观察者4.背压5.RxJava的基本用法步骤一,创建Observer(观察者)步骤二,创建Observable(被观察者)步骤三,Subscribe(订阅)RxJava是什么?是ReactiveX的一种Java实现。那,ReactiveX又是什么,我来与君言。ReactiveX 是 Reactive Extensions的缩写,一般简写为Rx,就这?确实就这。

Rose J 的博客 1624

Android RxJava:这是一份RxJava使用入门学习指南

此处简单介绍RxJavaAndroid:这是一篇 清晰 & 易懂的Rxjava 入门教程即 开厨房 - 确定对应菜式Next事件、Complete事件 &Error事件。具体如下:具体实现// 1. 创建观察者 (Observer )对象// 2. 创建对象时通过对应复写对应事件方法 从而 响应对应事件// 观察者接收事件前,默认最先调用复写 onSubscribe()@Override。

2401_83944560的博客 1088

【Android】写给小白的RxJava教程(三)

简介:大三学生党一枚!主攻Android开发,乐于交友一起学习! 个人语录:取乎其上,得乎其中,取乎其中,得乎其下,以顶级态度写好一篇的博客。 RxJava教程(三)一.RxJava中的创建操作符1.1 create1.2 just1.3 interval1.4 range1.5 timer2.1 map2.2 flatMap2.3 concatMap2.4 flatMapIterable2.5 buffer三.总结 一.RxJava中的创建操作符 什么是创建操作符?简而言之,就是会返回一个Observab

weixin_43927892的博客 1773

Android Retrofit 源码系列(三)~ 整合 RxJava、Coroutine 分析

前面我们介绍了 Retrofit 的基本原来以及如何自定义 CallAdapter。今天我们来看看 Retrofit 是如何整合 RxJava、Kotlin Coroutine 的。 整合 RxJava Retrofit 结合 RxJava 使用非常简单,只需要将接口方法的返回类型改成 Observable 即可: private interface UserService { // O...

Chiclaim 2485
上一篇: rxjava系列(二)-- 强大的操作符
下一篇: Android蓝牙实现设备间数据传输
mo_android
博客等级 码龄9年 12粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值