Android_Rxjava1.0、2.0

协程Flow原理 什么是冷流?什么是热流?冷流:没有消费者,生产者不会生产数据 没有观察者,被观察者不会发送数据热流:没有消费者,生产者也会生产数据 没有观察者,被观察者也会发送数据Flow是怎么流转的?直接搬大佬的图。Flow中间操作符是怎么做转换的?本质也是一个小的Flow流,在collect逻辑中终止上一步的流转,插入自己的逻辑,然后调用下一步流转Flow相比较RXJava有什么优势? 阅读详情

一:RxJava简单来说就是   异步

 特点:1.观察者模式

             2.链式调用

             3.线程调度

             4.灵活操作符


二:依赖

1.0依赖

compile 'io.reactivex:rxjava:1.3.4'
compile 'io.reactivex:rxandroid:1.2.1'

2.0依赖

compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'


三:1.0观察者与被观察者的创建方式

package com.rxjava;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Observer;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_1;
    private Button btn_2;
    private Button btn_3;
    private Button btn_4;
    private Button btn_5;
    private Button btn_6;
    private Subscription tag1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_1 = (Button)findViewById(R.id.btn_1);
        btn_1.setOnClickListener(this);
        btn_2 = (Button)findViewById(R.id.btn_2);
        btn_2.setOnClickListener(this);
        btn_3 = (Button)findViewById(R.id.btn_3);
        btn_3.setOnClickListener(this);
        btn_4 = (Button)findViewById(R.id.btn_4);
        btn_4.setOnClickListener(this);
        btn_5 = (Button)findViewById(R.id.btn_5);
        btn_5.setOnClickListener(this);
        btn_6 = (Button)findViewById(R.id.btn_6);
        btn_6.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_1:
                //被观察者创建方式一
                tag1 = Observable.just(1, 2, 3, 4)
                        .subscribeOn(Schedulers.io())
                        //类型转换
                        .map(new Func1<Integer, String>() {
                            @Override
                            public String call(Integer integer) {
                                return String.valueOf(integer);
                            }
                        })
                        .subscribe(new Action1<String>() {
                            @Override
                            public void call(String s) {
                                Log.i("TAG",s);
                            }
                        });
                break;
            case R.id.btn_2:
                //被观察者创建方式二
                String[] str = {"Hello","World","RxJava"};
                Observable<String> observable2 = Observable.from(str);
                observable2
                        .subscribeOn(AndroidSchedulers.mainThread())
                        .observeOn(Schedulers.io())
                        //平铺
                        .flatMap(new Func1<Student, Observable<Score>>() {
                            @Override
                            public Observable<Score> call(Student student) {
                                List<Score> scores = student.getScores();
                                return Observable.from(scores);
                            }
                        })
                        .subscribe(new Action1<Score>() {
                            @Override
                            public void call(Score score) {
                                Log.i("TAG",score+"");
                            }
                        });
                break;
            case R.id.btn_3:
                //被观察者创建方式三
                Observable<String> observable3 = Observable.create(new OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        subscriber.onNext("1");
                        subscriber.onNext("2");
                        subscriber.onNext("3");
                        //先执行完成就不会执行失败
                        //先执行失败就不会执行完成
                        subscriber.onCompleted();//完成
                        subscriber.onError(null);//失败
                    }
                });
                observable3
                        .subscribeOn(AndroidSchedulers.mainThread())
                        .observeOn(Schedulers.io())
                        .subscribe(new Observer() {
                            @Override
                            public void onCompleted() {

                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onNext(Object o) {
                                Log.i("TAG",o+"");
                            }
                        });
                break;
            case R.id.btn_4:
                //观察者创建方式一
                Observable<Integer> observable4 = Observable.just(1,2,3,4);
                Observer observer = new Observer() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Object o) {
                        Log.i("TAG",o+"");
                    }
                };
                observable4.subscribe(observer);
                break;

            case R.id.btn_5:

                //观察者创建方式二
                Observable<Integer> observable5 = Observable.just(1,2,3,4);

                Subscriber<Integer> intentSubscriber = new Subscriber<Integer>() {
                    @Override
                    public void onStart() {
                        super.onStart();
                    }

                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.i("TAG",integer+"");
                    }
                };
                observable5.subscribe(intentSubscriber);
                break;
            case R.id.btn_6:
                //观察者创建方式三
                Observable<Integer> observable6 = Observable.just(1,2,3,4);
                Action1 tag = new Action1() {
                    @Override
                    public void call(Object o) {
                        Log.i("TAG", o + "");
                    }
                };
                observable6.subscribe(tag);
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //防止内存泄漏
        if(tag1!=null){
            if(tag1.isUnsubscribed()){
                tag1.unsubscribe();
            }
        }
    }
}

四:2.0简单使用

package com.example.rxjava22;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;

import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import io.reactivex.FlowableEmitter;
import io.reactivex.FlowableOnSubscribe;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.subscribers.DisposableSubscriber;

public class MainActivity extends AppCompatActivity {

    private Disposable d;
    private DisposableSubscriber<Integer> tag;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //普通方式: Observer是观察者
        Observable.just(1,2)
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        MainActivity.this.d = d;
                    }

                    @Override
                    public void onNext(@NonNull Integer integer) {
                        Log.i("TAG",integer+"");
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

        //Flowable方式一:Subscriber是观察者
        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull FlowableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(4);
            }
        }, BackpressureStrategy.BUFFER)
                .subscribe(new Subscriber<Integer>() {
                    private Subscription s;
                    @Override
                    public void onSubscribe(Subscription s) {
                        this.s=s;
                        s.request(1);
                    }

                    @Override
                    public void onNext(Integer integer) {
                        s.request(1);
                        Log.i("TAG",integer+"");
                    }

                    @Override
                    public void onError(Throwable t) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
        //Flowable方式二:DisposableSubscriber是观察者
        tag = Flowable.just(1, 2, 3)
                .subscribeWith(new DisposableSubscriber<Integer>() {
                    @Override
                    public void onNext(Integer integer) {
                        Log.i("TAG", integer + "");
                    }

                    @Override
                    public void onError(Throwable t) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //防止内存泄漏
        if(d!=null){
            if(!d.isDisposed()){
                d.dispose();
            }
        }
        if(tag!=null){
            if(!tag.isDisposed()){
                tag.dispose();
            }
        }
    }
}





RxAndroid2.0.1 最新RxAndroid2.0.1 Jar包,本人找了好久才找到,给同样需要的人一个方便。 立即下载

相关推荐

RxJava2.0.1和RxAndroid2.0.1

文件内包含RxJava和RxAndroid两个架包,版本是2.0.1。

Android响应式编程框架---RxJava&RxAndroid2.0使用笔记

RxJava是什么?官方GitHub地址:https://github.com/ReactiveX/RxJava RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable s

DeMonnnnnn 8098

Rx系列资源 / rxjava-2.0.1 / rxjava-android-0.20.7 /

Rx系列资源 / rxjava-2.0.1 / rxjava-android-0.20.7 /

java call user func_Android-Retrofit2+Rxjava2之网络请求预处理-Func1、Subscriber

申明一下,目前对Rx家族还没做过什么研究和学习,目前要学习的东西比较多,暂且也是用Rx多一点点。所以就针对使用上做一个总结,记录一下,后续肯定还是要加强研究的。(这几天也是搞ViewPaper的轮播,主要是Glide动态加载和回收部分,搞了好几天....后面还打算继续研究,做一个自己需求的轮播(重点想搞下图片加载的优化部分 - 我看有的banner是直接一次性创建多个ImageView以及Glid...

weixin_39729840的博客 263

Rxjava2.1.6 Rxandroid2.0.1 jar包

Rxjava2.1.6(2017.10.27) Rxandroid2.0.1(2016.11) jar包 Rxjava2.1.6(2017.10.27) Rxandroid2.0.1(2016.11) jar包

Manimgl 进阶笔记

目录 一、调整视频输出的纵横比 二、调整预览窗口的尺寸 三、在开发工具中直接调试 一、调整视频输出的纵横比 调整输出视频的纵横比,在日常开发中属于比较基本的需求。要使用 Manimgl 得到期望的分辨率的视频输出需要修改以下几个地方: 第一步:在 custom_config.yml 配置文件中通过 camera_qualities设置视频的输出分辨率。manimlib 框架已经在 default_config.yml 文件中设置了四种视频输出分辨率,default_qualities 参数.

gunnery的专栏 2857

Android 热更新 的使用

如今市场上有很多热更新的第三方,我使用的是阿里的阿里百川hotfix2.0,对于各种热更新的优劣我就不介绍了,网上很多,例如:http://www.jianshu.com/p/2d0f70e30111直接进入正题: 阿里百川hotfix入口: http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.jIXDqS&

进击的码字猴 4635

自动驾驶仿真 (三)—— 基于PreScan与Simulink的AEB系统仿真

自动驾驶仿真三—— 基于PreScan&Simulink的AEB系统仿真1. AEB自动紧急制动系统1. 1 TTC碰撞时间模型1. 2 C-NCAP法规部分术语与定义1. 3 主动安全ADAS系统试验项目2. AEB仿真分析建模2.1 搭建场景2.2 传感器建模2.3 添加AEB控制系统3. 典型工况仿真3.1 CCRs仿真测试3.1 CCRm仿真测试4. 参考学习的书目教材 博主前面的博文已经介绍了Prescan&Simulink基本的场景建模及仿真分析流程,《自动驾驶仿真 (二)——

zhudj08的博客 1万+

java.lang.ClassNotFoundException: rx.functions.Func1解决方案

这个问题我是在运行网上大量一样的那种java生成词云的程序时遇到的(当然我前面还遇到了各种各样的问题)。博客园、优快云各种搜也没找到答案。 解答如下: 什么叫ClassNotFoundException?就是找不到这个类。 为什么找不到这个类?是因为找不到响应的包。 好,那么我们找包。 ???maven仓库居然搜不到叫rx的包? 终于!发现了这篇文章https://www.jianshu.com...

weixin_44186929的博客 1369

Windows 11下ROS2 Humble与PyCharm无缝集成实战(避坑指南+完整配置流程)

本文详细介绍了在Windows 11系统下如何实现ROS2 Humble与PyCharm的无缝集成,包括环境准备、ROS2 Humble安装、PyCharm配置以及C++与Qt5混合开发的实战技巧。通过避坑指南和完整配置流程,帮助开发者高效搭建稳定的机器人开发环境,特别适合Windows平台的ROS2开发者。

weixin_28710999的博客 366

STM32—时钟树(结合系统时钟函数理解)

时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32...

肥宅快乐博客 1万+

java.lang.ClassNotFoundException: rx.functions.Func1

I had the same issue today. In my case it was caused by a corrupt version of the rx jar in my local maven repo. I fixed it by deleting the rxjava folder inside .m2/io/reactivex. Then build your proje...

weixin_30455365的博客 739

PCL 中实现平面模型分割【2026最新版】

RANSAC分割平面。博客长期更新,最近一次更新时间为:2026年5月4日。

点云侠的博客 38万+

Android开发面试之RxJava

onComplete是用来控制不能发送数据的,也就是不能onNext了,包括onError也是不能再发送onNext数据了,该方法中也是调用了dispose方法。从上面各个对应的observer接口来看,如果只想发一条数据,或者不发数据就用Maybe,如果想法多条数据或者不发数据就用Observable,如果只发一条数据或者失败就用Single,如果想用背压策略使用Flowable,如果不发数据就用Completable。

2401_84121499的博客 1027

Unity零基础到入门 ☀️| 【UI系统学习】轻松学会 Unity 的 UGUI基础控件的使用(包括一个简易血条、蓝条设计)

Unity,UGUI。本篇博客来挑几种Unity中最常用的UI控件如何使用和使用技巧,包括一个简易血条蓝条的小实例

努力前行,总会成为自己心中的那道光 2万+

基于Requests的百度图片搜索爬取技术详解

本文介绍了一种高效获取百度图片搜索数据的混合请求爬虫技术。该技术结合HTML解析与JSON API调用,通过分析百度图片搜索的网络通信模式,实现了首页HTML解析获取初始参数、后续页面直接调用JSON接口的双重机制。系统采用模块化设计,包含Cookies解析、智能请求分发、数据提取、图片下载等核心模块,支持自定义关键词和爬取页数配置。关键技术包括动态参数管理、正则表达式提取、JSON数据处理等,相比传统爬虫方法具有效率高、资源消耗低的优势,为计算机视觉研究提供了可靠的大规模图片数据采集方案。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 419

Android RxJava第三弹之RxJava2.0尝鲜

Android RxJava第一弹之原理详解、使用详解、常用场景(基于Rxjava2.0)Android RxJava第二弹之RxJava封装库 RxJava+Animation RxJava+Glide在Android RxJava第一弹之原理详解、使用详解、常用场景(基于Rxjava2.0)一文中我一直在说RxJava2.0,2.0在16年八九月份的时候新出来 ,让我们一探究竟吧引言 RxJ

qq_28195645的博客 1461

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

每天学习一个Android中的常用框架——15.RxJava

RxJava的集成和快速使用

赈川 529

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android版&Kotlin版RxJava2+Retrofit2+OkHttp3的基础、封装和项目中的使用

1.引入Retrofit的包,在build.gradle文件中添加如下配置:compile ‘com.squareup.retrofit2:retrofit:2.3.0’//导入retrofitcompile ‘com.google.code.gson:gson:2.6.2’//Gson 库//下面两个是RxJava 和 RxAndroidcompile ‘com.squareup.retrofit2:converter-gson:2.3.0’//转换器,请求结果转换成Model。

2401_89317296的博客 1233

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 函数式编程,Android函数响应式编程最新RxJava-操作符入门(1)

Rxjava操作符包括创建操作符、变换操作符、过滤操作符、组合操作符、错误处理操作符、辅助操作符、条件操作符等等.今天介绍一下创建操作符和变换操作符1.创建操作符上一篇文章介绍了创建操作符 just create from , 还有defer,range,interval,repeat,timer等,下面介绍interval和range,repeat。(1).interval创建一个按固定时间发射...

weixin_29607417的博客 153

Android 异步框架 RxJava2

观察者模式的概念 RxJava是android的异步框架,官方介绍是可观测的序列,组成异步基于事件程序的库。特点是观察者模式,基于事件流的链式调用,随着异步操作调度过程复杂的情况下,程序逻辑也变得越来越复杂,但RxJava依然能够保持简洁。 简单的说观察者A与被观察者B建立订阅关系,当被观察者B发生某种改变时,立即通知观察者A 添加依赖 compile 'io.reactivex.rx...

weixin_30583563的博客 147

Android笔记:Android开发中的一些技术细节

最近总结了一些开发中应该注意的技术细节,特此记录下 Message obtain跟直接new的区别 : 本质是Message obtain是采用享元模式,所以效率会高一些 Rxjava操作符设计模式 : 看了一下源码其实就是装饰器模式 Gson泛型擦除:Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类...

weixin_45365889的博客 311

okhttp3+retrofit2+rxjava+MMVP以注册为例概述一个网络请求的完整流程

注:这里以注册为例概述网络请求的完整流程,是指以我的方式、流程进行的请求,不同的开发者有不同的思路和流程 一.引入包(如果有哪些找不到文件的,那就是缺包了)、网络权限 api com.squareup.retrofit2:adapter-rxjava:2.5.0 api com.squareup.retrofit2:converter-gson:2.5.0 api io.reactivex....

weixin_40420578的博客 725

Android 静默安装和卸载

一. 条件 系统签名 需要放到 /system/app里作为系统app 二. 适用环境 机顶盒开发,系统开发,车机开发,智能设备开发。 三. 步骤1. 在 AndroidManifest.xml 中 1.1. 在清单文件 AndroidManifest.xml 添加 android.uid.system 声明为系统应用。 1.2. 权限 java

mochixuan 1853

retrofit 如何查看日志

retrofit 查看日志近期在学习 retrofit+rxJava 这个框架的时候,下面是我学习的网站: http://gank.io/post/56e80c2c677659311bed9841?from=timeline&isappinstalled=0&nsukey=g1D1Y6PMp3BW%2B0%2F%2Butx4StSJxcUCTm4%2BN8T7LnPNCCeQEY1lzm6oKv

android_小路的博客 2695
上一篇: Android_Retrofit封装
下一篇: Android_RxBus传值
绅V科技
博客等级 码龄9年 61粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值