【问题标题】:Invoke method only when other method are done - RxJava仅在其他方法完成时调用方法 - RxJava
【发布时间】:2019-03-03 11:14:46
【问题描述】:

我有两种方法:

private void method1() throws InterruptedException {
        //SimulateLongOperation
        Thread.sleep(5000);
        System.out.println("hello1");
    }

private void method2(){
        System.out.println("hello2");
    }

我想在 method1 完成后调用 method2,但我不想阻塞 UI 线程。
是否可以使用 RxJava 做到这一点?
它会是什么样子?网上没有简单的例子,只有看不懂的好文章。

当我调用时:

method1();  
method2(); 

我阻塞了主线程,太可怕了。

【问题讨论】:

    标签: java android rx-java rx-java2 rx-android


    【解决方案1】:

    您也可以尝试以下方法:

    • 使用 Kotlin:
         Completable.fromAction{ method1() }
                .doOnComplete{ method2() }
                .subscribeOn(Schedulers.io())
                .subscribe()
    
    • 使用 Java:
         Completable.fromAction(() -> method1() )
                .doOnComplete(__ ->  method2())
                .subscribeOn(Schedulers.io())
                .subscribe()
    

    【讨论】:

      【解决方案2】:

      由于您正在寻找一个非常具体的答案,我将在此处发布一个简单的实现。根据您的用例,可能会有更好的解决方案。

          private void method1() throws InterruptedException {
                  //SimulateLongOperation
                  Thread.sleep(5000);
                  System.out.println("hello1");
              }
      
          private void method2(){
                  System.out.println("hello2");
              }
      
          void solution() {
            Observable<Void> first = Observable.fromCallable(() -> {
                      method1();
                      return null;
                  });
          Observable<Void> second = Observable.fromCallable(() -> {
                      method2();
                      return null;
                  });
          first.flatMap((Function<Void, ObservableSource<?>>) aVoid -> second)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe();
          }
      

      【讨论】:

      • 这个 rxjava 方法看起来很不可读。有没有更简单的代码?
      • 这是我能想到的最简单的。如果您能指出哪个部分看起来很复杂,我可以尝试解释并使其更易于理解。
      • 我无法在 Observable 上调用“fromCallable”
      • 您使用的是 RxJava 1 还是 2?此代码对 RxJava 2 有效。请将以下几行添加到您的 build.gradle implementation "io.reactivex.rxjava2:rxjava:2.2.0" implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 2021-01-27
      • 2017-06-25
      • 1970-01-01
      相关资源
      最近更新 更多