博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3.RxJava详解
阅读量:5058 次
发布时间:2019-06-12

本文共 5247 字,大约阅读时间需要 17 分钟。

一、

异步(取代AsyncTask/Handler/XXX/...?)
 
二、
 
简洁(逻辑的简洁,.一步一走)
 
举例:
题目:将文件夹中的图片都取出来,放到界面上显示。
1.Thread
new 
Thread() {
    
@Override
    
public void run() {
        
super
.run();
        
for 
(File folder : folders) {
            
File[] files = folder.listFiles();
            
for 
(File file : files) {
                
if 
(file.getName().endsWith(
".png"
)) {
                    
final Bitmap bitmap = getBitmapFromFile(file);
                    
getActivity().runOnUiThread(
new 
Runnable() {
                        
@Override
                        
public void run() {
                            
imageCollectorView.addImage(bitmap);
                        
}
                    
});
                
}
            
}
        
}
    
}}.start();
2.RxJava
Observable.from(folders)
    
.flatMap(
new 
Func1<File, Observable<File>>() {
        
@Override
        
public Observable<File> call(File file) {
            
return 
Observable.from(file.listFiles());
        
}
    
})
    
.filter(
new 
Func1<File, Boolean>() {
        
@Override
        
public Boolean call(File file) {
            
return 
file.getName().endsWith(
".png"
);
        
}
    
})
    
.map(
new 
Func1<File, Bitmap>() {
        
@Override
        
public Bitmap call(File file) {
            
return 
getBitmapFromFile(file);
        
}
    
})
    
.subscribeOn(Schedulers.io())
    
.observeOn(AndroidSchedulers.mainThread())
    
.subscribe(
new 
Action1<Bitmap>() {
        
@Override
        
public void call(Bitmap bitmap) {
            
imageCollectorView.addImage(bitmap);
        
}
    
});

三、
 
1.概念:扩展的观察者模式
1)观察者模式:
观察者通过 
注册(Register)
或者称为订阅(
Subscribe)的方式,通过警报,让被观察者发生某种行为的时候,通知一下观察者。
例如:onClickListener():view按钮被点击的时候,view相当于被观察者,就会触发onClickListener的监听,通知调用OnClick被观察者,两者是通过setOnClickListner订阅的。
   
         
          
2)RxJava的观察者模式
RxJava有4个基本概念:Observable(被观察者),Observer(观察者),subscribe(订阅),onNext()...->onCompleted()/onError()(事件)。
2.基本实现
1)创建Observer:它决定事件触发的时候有怎样的行动。(new)
Observer<String> observer = 
new 
Observer<String>() {
    
@Override
    
public void onNext(String s) {
        
Log.d(tag, 
"Item: " 
+ s);
    
}
 
    
@Override
    
public void onCompleted() {
        
Log.d(tag, 
"Completed!"
);
    
}
 
    
@Override
    
public void onError(Throwable e) {
        
Log.d(tag, 
"Error!"
);
    
}};
②实现了Observer的抽象类Subscriber:
Subscriber<String> subscriber = 
new 
Subscriber<String>() {
    
@Override
    
public void onNext(String s) {
        
Log.d(tag, 
"Item: " 
+ s);
    
}
 
    
@Override
    
public void onCompleted() {
        
Log.d(tag, 
"Completed!"
);
    
}
 
    
@Override
    
public void onError(Throwable e) {
        
Log.d(tag, 
"Error!"
);
    
}};
Subscriber比Observer多的东西:
onStart():在事件未发生之前调用,准备工作,执行在工作线程;doOnAubscribe()指定线程来做准备工作。
unsubscribe()取消订阅,在onStop()方法里边调用,释放资源,防止内存泄露。
 
2)创建Observable:它决定什么时候触发事件,触发怎样的事件。(onCreate())
Observable observable = Observable.create(
new 
Observable.OnSubscribe<String>() {
    
@Override
    
public void call(Subscriber<? 
super 
String> subscriber) {
        
subscriber.onNext(
"Hello"
);
        
subscriber.onNext(
"Hi"
);
        
subscriber.onNext(
"Aloha"
);
        
subscriber.onCompleted();
    
}});
由此可见,传入了一个subscriber作为参数,Observable在被订阅的时候调用call(),事件就会依序执行。
简单写法:
Observable observable = Observable.just(
"Hello"
"Hi"
"Aloha"
);
 
String[] words = {
"Hello"
"Hi"
"Aloha"
};        Observable observable = Observable.from(words);
 
3)subscribe(订阅)
observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
注:Observable.subscribe(subscriber)订阅的内部实现:
public Subscription subscribe(Subscriber subscriber) {
    
subscriber.onStart();            //准备
    
onSubscribe.call(subscriber);    //事件发送的逻辑开始
    
return 
subscriber;               //返回监听对象
}
                
除了 subscribe(Observer) 和 subscribe(Subscriber) ,subscribe() 还支持不完整定义的回调,RxJava 会自动根据定义创建出Subscriber 。形式如下:
Action1<String> onNextAction = 
new 
Action1<String>() {
    
// onNext()
    
@Override
    
public void call(String s) {
        
Log.d(tag, s);
    
}
};
Action1<Throwable> onErrorAction = 
new 
Action1<Throwable>() {
    
// onError()
    
@Override
    
public void call(Throwable throwable) {
        
// Error handling
    
}
};
Action0 onCompletedAction = 
new 
Action0() {
    
// onCompleted()
    
@Override
    
public void call() {
        
Log.d(tag, 
"completed"
);
    
}
};
 
// 自动创建 Subscriber ,并使用 onNextAction 来定义 onNext()
observable.subscribe(onNextAction);
// 自动创建 Subscriber ,并使用 onNextAction 和 onErrorAction 来定义 onNext() 和 onError()
observable.subscribe(onNextAction, onErrorAction);
// 自动创建 Subscriber ,并使用 onNextAction、 onErrorAction 和 onCompletedAction 来定义 onNext()、 onError() 和 onCompleted()
observable.subscribe(onNextAction, onErrorAction, onCompletedAction);
实例:
由id取得图片并显示
int drawableRes = ...;
ImageView imageView = ...;
Observable.create(
new 
OnSubscribe<Drawable>() {
    
@Override
    
public void call(Subscriber<? 
super 
Drawable> subscriber) {
        
Drawable drawable = getTheme().getDrawable(drawableRes));
        
subscriber.onNext(drawable);
        
subscriber.onCompleted();
    
}
}).subscribe(
new 
Observer<Drawable>() {
    
@Override
    
public void onNext(Drawable drawable) {
        
imageView.setImageDrawable(drawable);
    
}
 
    
@Override
    
public void onCompleted() {
    
}
 
    
@Override
    
public void onError(Throwable e) {
        
Toast.makeText(activity, 
"Error!"
, Toast.LENGTH_SHORT).show();
    
}
});
3.线程控制——Scheduler(调度器)
在不指定线程的情况下,RxJava遵循线程不变的原则。(在哪个线程调用subscribe(),就在哪个线程生产事件,消费事件)
1)Scheduler的API
  • Schedulers.immediate():当前线程。
  • Schedulers.newThread():新启线程。
  • Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。(*)
  • Schedulers.computation(): 计算所使用的 Scheduler。
  • AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
  • subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
  • observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
Observable.just(1, 2, 3, 4)
    
.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
    .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
    
.subscribe(
new 
Action1<Integer>() {
        
@Override
        
public void call(Integer number) {
            
Log.d(tag, 
"number:" 
+ number);
        
}
    
});

 

转载于:https://www.cnblogs.com/wangjinger/p/RxJava3.html

你可能感兴趣的文章
Informix IDS 11系统操持(918考试)认证指南,第 7 部门: IDS复制(17)
查看>>
[优化算法] 拉丁超立方采样与基于优化的均匀采样
查看>>
.NET EasyUI datebox添加清空功能
查看>>
session如何保存在专门的StateServer服务器中
查看>>
maven中snapshot快照库和release发布库的区别和作用
查看>>
C#作业补充(6)
查看>>
luogu1919 A*BProblem升级版 (FFT)
查看>>
react展示数据
查看>>
测试计划
查看>>
idea设置自定义图片
查看>>
[高级]Android多线程任务优化1:探讨AsyncTask的缺陷
查看>>
选择器
查看>>
rownum 的使用
查看>>
Mysql与Oracle 的对比
查看>>
MVC系列博客之排球计分(三)模型类的实现
查看>>
Android短信拦截
查看>>
11G RAC ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O
查看>>
11G RAC 修改 SGA PGA
查看>>
oracle 12.1.0.2 TNS-12518
查看>>
Spring Boot修改启动图案
查看>>