Rxjava之PublishSubject的使用

本文介绍了RxJava中的PublishSubject如何简化Android应用中Service到Activity的数据传递过程,通过具体示例对比了PublishSubject与其他几种常见通信方式的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题引入

此前对rxjava的诸多用法小小的进行过总结,rxjava的使用给代码设计带来了很多惊奇和方便。但是在了解到PublishSubject之后再次被rxjava的简便给折服了。在介绍PublishSubject之前,先容我给出这样一个命题,在Android的开发中,我们经常会在Service中处理批量下载的任务,然后将下载的进度显示在Activity中。如果需要完成Service中数据的更新到Activity数据的显示,可行的方案有哪些。

目前能够列举到的方案有如下:
1. DataBinding
2. 广播
3. EventBus
4. Rxjava的PublishSubject

这些方案中DataBinding,网上关于它的介绍不俗,但是我看实现中用起来还是有点麻烦,或许是我没有深入的了解和使用,它不是本文要介绍的重点。广播在使用中需要编写注册,解除注册的代码以及相关的BroadcastReceiver代码,代码量感觉小小的有点大。EventBus比广播要好一点点,但是同样需要注册EventBus和取消注册EventBus,只是可以通过注解来指定完成事件响应的函数。Rxjava的PublishSubject在设计中省去了注册和取消注册的逻辑,比广播和EventBus更高一筹。

二、Rxjava的PublishSubject的使用

以命题中介绍的Service进行批量下载,在Service中更新数据和Activity中显示数据为例来介绍Rxjava的PublishSubject的使用。

/**
*Service部分的代码逻辑
**/
import rx.Observable;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subjects.PublishSubject;
public class DownLoadService extends Service {
...
private static final PublishSubject<DownloadInfo> EVENT_PUBLISH_SUBJECT = PublishSubject.create();//构造一个PublishSubject

/**
*提供对外的PublishSubject
**/
public static Observable<DownloadInfo> getStatusObservable() {
        return EVENT_PUBLISH_SUBJECT.onBackpressureLatest();//此处采用Rxjava背压防止事件发生过快
    }

 /**
*对外发布下载更新的数据
**/   
private void updateDownloadStatus(DownloadInfo downloadInfo) {
            ...
            EVENT_PUBLISH_SUBJECT.onNext(chapterInfo);
           ...
            }

Activity中的代码逻辑如下

import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
import rx.subjects.PublishSubject;

public class DownloadActivity extends AppCompatActivity {

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        receiveCacheProgress();
        ...
    }

    /**
    *从service中获取下载更新的数据
    **/
   private void receiveCacheProgress() {
        DownloadService.getStatusObservable().compose(this.<DownloadInfo>avoidStateLoss()) //rxlifecycle 防止Activity关闭带来的内存泄漏
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<DownloadInfo>() {
                    @Override
                    public void call(DownloadInfo downloadInfo) {
                        processProgress(downloadInfo);
                    }
                });
    }

   /**
   *对进度更新后的数据在一个recycleView中进行显示
   **/
   private void processProgress(DownloadInfo downloadInfo) {
       ...
        if (listAdapter != null) {
            listAdapter.updateProgress(downloadInfo);
        }
       ...
    }
}

上述代码仅仅只写了Rxjava代码所需要编写的部分,从设计模式的角度出发,可以理解为在Service中定义了一个静态被观察者,并提供了这个被观察者的静态方法和触发这个被观察者事件,在Activity中获取这个被观察者后就进行订阅。省去了广播和Eventbus中很明显的需要注册和解除注册的环节,关于不解除注册可能带来的内存泄漏,在代码中已经使用rxlifecycle来进行解决了(rxlifecycle的相关介绍:https://blog.youkuaiyun.com/polo2044/article/details/80559390

三、参考链接

https://www.cnblogs.com/Jason-Jan/p/8017412.html
https://www.jianshu.com/p/428a5257839c
https://www.jianshu.com/p/6f1ea19a17ed

### RxJava 使用教程与示例代码 RxJava 是一个用于处理异步数据流的强大工具,广泛应用于 Android 和 Java 开发中。以下是一些关于 RxJava使用指南和示例代码。 #### 1. RxJava 基本概念 RxJava 是基于观察者模式的库,它通过可观察序列的形式统一了异步和事件驱动编程。开发者可以创建、订阅和操作这些序列,以实现复杂的异步逻辑[^4]。 #### 2. RxJava3 在 Android 中的使用 对于 Android 开发者来说,RxJava3 提供了更简洁的 API 和改进的错误处理机制。以下是一个简单的示例代码,展示了如何使用 RxJava3 创建和订阅 Observable: ```java import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.disposables.Disposable; public class RxJavaExample { public static void main(String[] args) { // 创建一个 Observable Observable<String> observable = Observable.just("Hello", "World"); // 订阅 Observable Disposable disposable = observable.subscribe( s -> System.out.println(" onNext: " + s), Throwable::printStackTrace, () -> System.out.println(" onComplete") ); // 确保资源释放 disposable.dispose(); } } ``` 上述代码展示了如何创建一个简单的 Observable 并订阅它。`Observable.just()` 方法用于快速创建一个包含固定值的 Observable[^1]。 #### 3. RxJava2 到 RxJava3 的迁移 如果开发者正在从 RxJava2 迁移到 RxJava3,可以参考项目 [RxJava3-Android-Examples](https://gitcode.com/amitshekhariitbhu/RxJava3-Android-Examples)。该项目提供了详细的迁移指南和示例代码,帮助开发者轻松过渡[^1]。 #### 4. RxJava 在 MVVM 架构中的应用 在 Java 桌面开发中,RxJava 可以与 Swing 结合使用,实现 MVVM(Model-View-ViewModel)架构。以下是一个简单的示例,展示了如何使用 RxJava 和 RxSwing 实现 MVVM: ```java import io.reactivex.rxjava3.subjects.PublishSubject; import io.reactivex.rxjava3.disposables.CompositeDisposable; public class MVVMExample { private final PublishSubject<String> textChanges = PublishSubject.create(); private final CompositeDisposable disposables = new CompositeDisposable(); public void bindTextChanges() { disposables.add( textChanges.subscribe(text -> System.out.println("Text changed to: " + text)) ); } public void updateText(String newText) { textChanges.onNext(newText); } public void dispose() { disposables.dispose(); } } ``` 此代码片段展示了如何使用 `PublishSubject` 来监听文本变化,并将这些变化绑定到 ViewModel 中[^3]。 #### 5. RxJava 在 Android 中的实际应用 在 Android 开发中,RxJava 经常与 Retrofit 或 Room 数据库结合使用,以简化网络请求和数据库操作。以下是一个使用 RxJava 和 Retrofit 的示例: ```java import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.schedulers.Schedulers; import retrofit2.Retrofit; import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class NetworkExample { public static void createApiService() { Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); apiService.getData() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(response -> System.out.println("Response: " + response), throwable -> throwable.printStackTrace()); } } ``` 上述代码展示了如何使用 RxJava 处理网络请求,并通过线程调度器优化性能[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值