Android中的RxJava

本文详细介绍了RxJava在Android开发中的使用场景,包括响应式编程的核心思想、配合其他框架的常见用法、防抖、网络嵌套及复杂应用。文章深入探讨了RxJava的原理,如观察者模式、Hook机制、洋葱模型,并提供了自定义操作符的示例,帮助开发者提升对线程切换和事件流控制的理解。
摘要由CSDN通过智能技术生成

最近准备梳理一下Kotlin,先复习一遍RxJava思想,做个学习笔记+伪代码,整个脉络分为三个部分。

(一)使用场景

RxJava是重量级、最复杂的框架(没有之一),JakeWharton 的巅峰之作,操作符非常丰富、特别庞大,学关键的内容,学思维方式,看PPT资料,学两遍。

为什么要学习RxJava?

改变思维(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࿱
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小山研磨代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值