RxJava中怎么实现取消订阅功能
创始人
2024-12-22 18:21:34
0次

手动取消订阅

Consumer类型

Observable创建返回Disposable取消

public class SecondActivity extends AppCompatActivity {  private static final String TAG = "SecondActivity";  private Disposable disposable;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_second);    disposable = Observable.create(new ObservableOnSubscribe() {      @Override      public void subscribe(ObservableEmitter emitter) throws Exception {        try {          Thread.sleep(5000);        } catch (InterruptedException e) {          e.printStackTrace();        }      }    }).subscribeOn(Schedulers.io())        .observeOn(AndroidSchedulers.mainThread())        .subscribe(new Consumer() {          @Override          public void accept(String s) throws Exception {            Log.d(TAG, "accept: "+s);          }        });  }  @Override  protected void onDestroy() {    super.onDestroy();    Log.d(TAG, "onDestroy: ");    //取消订阅    if(disposable != null && !disposable.isDisposed()){      disposable.dispose();      Log.d(TAG, "onDestroy: dispose");    }  }}

普通类型Observer

在Observer中获取Disposable然后取消

public class ThirdActivity extends AppCompatActivity {  private static final String TAG = "ThirdActivity";  Disposable disposable;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_third);    Observable.create(new ObservableOnSubscribe() {      @Override      public void subscribe(ObservableEmitter emitter) throws Exception {        try {          Thread.sleep(5000);          emitter.onNext("testInfo");        } catch (InterruptedException e) {          e.printStackTrace();        }      }    }).subscribeOn(Schedulers.io())        .observeOn(AndroidSchedulers.mainThread())        .subscribe(new Observer() {          @Override          public void onSubscribe(Disposable d) {            disposable = d;          }          @Override          public void onNext(String s) {            Log.d(TAG, "onNext: "+s);          }          @Override          public void onError(Throwable e) {            Log.d(TAG, "onError: ");          }          @Override          public void onComplete() {            Log.d(TAG, "onComplete: ");          }        });  }  @Override  protected void onDestroy() {    super.onDestroy();    Log.d(TAG, "onDestroy: ");    //然后在需要取消订阅的地方调用即可    if (disposable != null && !disposable.isDisposed()) {      Log.d(TAG, "dispose: ");      disposable.dispose();    }  }}

DisposableObserver类型

利用DisposableObserver和SubscribeWith直接返回Disposable,然后取消

public class FourthActivity extends AppCompatActivity {  private static final String TAG = "FourthActivity";  private DisposableObserver observer;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_fourth);    observer = Observable.create(new ObservableOnSubscribe() {      @Override      public void subscribe(ObservableEmitter emitter) throws Exception {        try {          Thread.sleep(5000);          emitter.onNext("testInfo");        } catch (InterruptedException e) {          e.printStackTrace();        }      }    }).subscribeOn(Schedulers.io())        .observeOn(AndroidSchedulers.mainThread())        .subscribeWith(new DisposableObserver() {      @Override      public void onNext(String o) {        Log.d(TAG, "onNext: "+o);      }      @Override      public void onError(Throwable e) {        Log.d(TAG, "onError: ");      }      @Override      public void onComplete() {        Log.d(TAG, "onComplete: ");      }    });  }  @Override  protected void onDestroy() {    super.onDestroy();    if (observer != null && !observer.isDisposed()) {      Log.d(TAG, "dispose: ");      observer.dispose();    }  }}

取消多个Observer

把多个Observer添加CompositeDisposable,一次取消

public class ComDisposableActivity extends AppCompatActivity {  private Disposable disposable1;  private Disposable disposable2;  private static final String TAG = "ComDisposableActivity";  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_com_disposable);    Observable.create(new ObservableOnSubscribe() {      @Override      public void subscribe(ObservableEmitter emitter) throws Exception {        try {          Thread.sleep(5000);          emitter.onNext("testInfo");        } catch (InterruptedException e) {          e.printStackTrace();        }      }    }).subscribeOn(Schedulers.io())        .observeOn(AndroidSchedulers.mainThread())        .doOnDispose(new Action() {          @Override          public void run() throws Exception {            Log.d(TAG, "run: Unsubscribing subscription from onCreate()");          }        })        .subscribe(new Observer() {          @Override          public void onSubscribe(Disposable d) {            disposable1 = d;          }          @Override          public void onNext(String s) {            Log.d(TAG, "onNext: "+s);          }          @Override          public void onError(Throwable e) {            Log.d(TAG, "onError: ");          }          @Override          public void onComplete() {            Log.d(TAG, "onComplete: ");          }        });    Observable.create(new ObservableOnSubscribe() {      @Override      public void subscribe(ObservableEmitter emitter) throws Exception {        try {          Thread.sleep(5000);          emitter.onNext("testInfo");        } catch (InterruptedException e) {          e.printStackTrace();        }      }    }).subscribeOn(Schedulers.io())        .observeOn(AndroidSchedulers.mainThread())        .subscribe(new Observer() {          @Override          public void onSubscribe(Disposable d) {            disposable2 = d;          }          @Override          public void onNext(String s) {            Log.d(TAG, "onNext: "+s);          }          @Override          public void onError(Throwable e) {            Log.d(TAG, "onError: ");          }          @Override          public void onComplete() {            Log.d(TAG, "onComplete: ");          }        });  }  @Override  protected void onDestroy() {    super.onDestroy();    CompositeDisposable compositeDisposable = new CompositeDisposable();    //批量添加    compositeDisposable.add(disposable1);    compositeDisposable.add(disposable2);    //最后一次性全部取消订阅    compositeDisposable.dispose();  }}

RxLifecyle取消

OnDestory取消

Observable.interval(1, TimeUnit.SECONDS)        .doOnDispose(new Action() {          @Override          public void run() throws Exception {            Log.d(TAG, "Unsubscribing bindToLifecycle from onDestroy()");          }        })        .compose(this.bindToLifecycle())        .subscribe(new Consumer() {          @Override          public void accept(Long num) throws Exception {            Log.d(TAG, "accept: " + num);          }        });

指定生命周期取消

Observable.interval(1,TimeUnit.SECONDS)        .doOnDispose(new Action() {          @Override          public void run() throws Exception {            Log.d(TAG, "Unsubscribing UbindUntilEvent from onPause()");          }        }).compose(this.bindUntilEvent(ActivityEvent.PAUSE))        .subscribe(new Consumer() {          @Override          public void accept(Long aLong) throws Exception {            Log.d(TAG, "bindUntilEvent accept: " + aLong);          }        });

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...