最近准备梳理一下
Kotlin
,先复习一遍RxJava
思想,做个学习笔记+伪代码,整个脉络分为三个部分。
(一)使用场景
RxJava
是重量级、最复杂的框架(没有之一),JakeWharton 的巅峰之作,操作符非常丰富、特别庞大,学关键的内容,学思维方式,看PPT资料,学两遍。
为什么要学习RxJava?
改变思维(Rx思维)来提升效率,响应式编程/异步事件流编程
Rx思维:起点(分发事件)—>…—>终点(消费事件),中间不会断掉且可以做拦截,链条式思维
学习资料
-
思维扩展:Rx系列
【以下五部分难度逐步提升!!!】
一、核心思想(基础⭐)
传统思维:不同项目(程序员)实现有不同的思路,封装、Thread、线程池……
dialog—>Thread
/AsyncTask
/…—>Handler
—>UI
Rx思维/卡片式编程/观察者设计模式:
起点/被观察者/Observable—>订阅—>终点/观察者/Observer
封装线程调度,方便多处使用线程切换:
// 封装线程调度,UD:upstram/downloadstream
private final static <UD> ObservableTransformer<UD, UD> rxud {
return new ObservableTransformer<UD, UD>(){
@override
public ObservableSource<UD> apply(Observable<UD> upstream){
// 方法返回自己this,链式调用无限扩展,可以继续作死的调用
return upstream.subscribeOn(Schedulers.io())//给上层分配异步线程
.observerOn(AndroidSchedulers.mainThread())// 给下层分配主线程
.map(new Function<UD, UD>(){
Log.d(TAG, "balabala...");
return null;
});
}
}
}
事件触发:
public void reJavaDownloadImageAction(View view){
Observable.just(PATH)// ②起点
.map(new Function<String, Bitmap>(){
// ③卡片式拦截
...// 请求服务器下载图片操作
return bitmap;
})
.map(new Function<Bitmap, Bitmap>(){
// +需求:水印
...// 加水印操作
return newBitmap;
})
.map(new Function<Bitmap, Bitmap>(){
// +需求:日志
Log.d(TAG, "balabala...");// Log
return newBitmap;
})
// 线程调度
//.subscribeOn(Schedulers.io())
//.observerOn(AndroidSchedulers.mainThread())
.compose(rxud())// 可以抽取封装起来
.subscribe(// 订阅,上层区域和下层区域
new Observer<Bitmap>() {
// 终点
onSubScribe(Disposable d)// ①订阅开始,预备操作
onNext(Bitmap bitmap){
// ④拿到事件,和起点类型一致
image.setImageBitmap(bitmap);
}
onError(Throwable e)// 错误事件
onComplete()// ⑤完成事件
}
);
}
二、RxJava
配合Retrofit
(常用⭐⭐)
常用的网络模型框架开发组合套装:
Retrofit
(通过OkHttp
请求网络)—>RxJava
(仅处理返回数据)—>UI
注:Retrofit
不是网络框架,是个强大的封装框架,负责管理
网络请求接口
interface WanAndroidApi{
// 异步线程,耗时操作
// 总数据
@GET("project/tree/json")
Observable<ProjectBean> getProject();
// Item数据
//@GET("project/list/1/json?cid=294")
@GET("project/list/{pageIndex}/json")// 使用注解动态传参
Observable<ProjectItem> getProject(@Path("pageIndex")int pageIndex, @Query("cid")int cid);
}
具体工具类封装:
HttpUtil {
public static String BASE_URL="https://www.wanandroid.com/";
public static void setBaseUrl(String baseUrl) {
BASE_URL = baseUrl;
}
// 根据各种配置创建出Retrofit
public static Retrofit getOnlineCookieRetrofit() {
// OkHttp客户端
OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(new HttpLogger());
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = httpBuilder
.addInterceptor(logInterceptor)
.addNetworkInterceptor(new StethoInterceptor())
.readTimeout(1000, TimeUnit.SECONDS)
.connectTimeout(1000, TimeUnit.SECONDS)
.writeTimeout(1000, TimeUnit.SECONDS)
.build();
return new Retrofit.Builder().baseUrl(BASE_URL)
// step1:请求用OkHttp
.client(okHttpClient)
// step2