RxAndroid入门-传智播客
16lz
2022-04-05
01_监听回调
RxJava在Android中的应用
主要内容:
- RxJava是什么,能解决什么问题
- 对比其他技术理解为什么要选择RxJava
- RxJava相关API
- RxJava在Android中的典型使用场景
- RxJava在Android中与其他框架的融合
RxJava是什么,能解决什么问题
github介绍:
a library for composing asynchronous and event-based programs by using observable sequences.
一个运行在Java VM上的库,通过可观察的序列来组成异步的、基于时间的程序。
解决问题:
让复杂程序逻辑回归简单、清晰
异步的介绍
ButterKnife 的配置:引入方式,(5.1.1的。。。
SystemClock.sleep(2000);//界面阻塞
开启子线程做耗时操作:异步请求获取数据(网络请求、数据库查询、文件读写等
code1:
getResuultAsync(){ calcService.calcAsync(10,5,this);}calcAsync(int total,int person,Activity a){ new Thread(new Runnable(){ ... a.onSuccess(result); ... a.onFailed(); }).start(); }
code2:面向接口编程,通过监听回调的方式实现回调
calcAsync(int total,int person,OnResultListener a){ new Thread(new Runnable(){ ... a.onSuccess(result); ... a.onFailed(); }).start(); }
总结,一种是在调用的时候传入接口,另一种是先设置监听方法,再调用请求方法。
02_RxJava的基本实现
- RxJava四个基本概念
- Observable(可观察者/被观察者)
- Observer(观察者/订阅者)
- subscribe(订阅)
- Event(事件)
如何使用
build.gradle引入依赖
compile 'io.reactivex:rxandroid:1.2.1'compile 'io.reactivex:rxjava:1.1.6'
对比其他技术理解为什么要选择RxJava
- Observable(被观察者)和Subscribe(订阅者)可以做任何事情
- Observable可以是一个网络请求,Subscribe来显示请求结果
- Observable可以是一个数据库查询,Subscribe来显示查询结果
- Observable可以是按钮点击事件,Subscribe来响应点击事件
- Observable可以是大图片文件的加载解析,Subscribe来展示解析的结果
简单的基本使用:
Observable.create(….)
变形的使用1(被观察者变形):
Observable.just(T...)// 就相当于上面new 出来一个OnSubscribe对象 .subscribe(new Observer(){ onCompleted(){} onNext(){} onError(){} });
变幻2:
Observable.from(new String[]{"a","b"})// 接收集合或者数组 .subscribe(new Subscriber(){// Subscriber是继承了Observer onStart(){}// 多出来的一个方法,表示事件开始的时候 onCompleted(){} onNext(){} onError(){} })Subscriber subscriber = ...;subscriber.unsubscribe();//在onStop的时候可以调用onStop(){ if(subscriber!=null && !subscriber.isUnsubscribed()){ subscriber.unsubscribe(); }}
03_操作符及线程调度
变换3:
Observable.from(new String[]{"a","b"}) .subscribe(new Action1(){ prublic void call(String s){ } });
变换4:
Observable.from(new String[]{"a","b"}) .subscribe(new Action1(){// onNext public void call(String s){ } },new Action1(){// onError public void call(Throwable t){ } },new Action0(){//onCompleted public void call(){ sop("compeleted"); } });
操作符
转换(Map) 将一个对象转换成另外一个对象
可能是将网络数据转成bean 也可能是cursor转成bean 或者流转成图片等等
线程调度器
Thread.currentThread().getName();在call 和next方法中打印线程名称发现都是main
Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber<? super String> subscriber) { String name = Thread.currentThread().getName(); Log.d("tag", "call " + name); subscriber.onNext("123"); subscriber.onNext("12343"); subscriber.onCompleted(); } }).subscribe(new Observer() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { String name = Thread.currentThread().getName(); Log.d("tag", "onNext " + name); } });}
指定线程:
subscribeOn : 可以执行多次
subscribe : 只需要执行一次,指定订阅者执行的线程
Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber<? super String> subscriber) { String name = Thread.currentThread().getName(); Log.d("tag", "call " + name); subscriber.onNext("123"); subscriber.onNext("12343"); subscriber.onCompleted(); } }) .subscribeOn(Schedulers.io())//让subscribe的操作执行在异步线程 .observeOn(AndroidSchedulers.mainThread())//让订阅者代码执行在UI线程 .subscribe(new Observer() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { String name = Thread.currentThread().getName(); Log.d("tag", "onNext " + name); } });
- 小结线程调度
- Schedulers.immediate() 默然线程
- Schedulers.newThread() 每次都创建新的线程
- Schedulers.io() 包含线程池的机制 个数无线 可以复用空闲线程
- Schedulers.computation() CPU密集计算线程,线程池数和CPU数一致,一般用在图形运算
- AndroidSchedulers.mainThread() Android更新界面的UI主线程
线程的切换案例:
- flatMap 平铺对象 把集合中的对象取出来
- take(2) 只去前2个
- distinct() 去重
- toList() 重新打包成集合
- filter() 过滤
微信:mm7718mm
QQ:3077485083
更多相关文章
- Android中当前时间的动态显示
- Android(安卓)WakeLock
- android 获取camera状态?
- Android(安卓)Activity加入半透明蒙板,实现夜间模式
- Android(安卓)多线程2
- Android(安卓)音量 获取 设置
- Android(安卓)handler.obtainMessage()传字符串用法
- Android常用的工具类-收藏用
- android 网络异步加载数据进度条