web-dev-qa-db-ja.com

AsyncTaskと同じように、RxJavaでプログレスバーを使用したい

AndroidでAsyncTaskをRxJavaに置き換えたい。私の現在のAsyncTaskは次のようになります:

public class ProgressBarAsyncTask extends AsyncTask<Void,Void,Void> { 

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        ringProgressDialog = ProgressDialog.show(context,"MyProgressBarTitle","Working please wait",true, false);                  
    }

    @Override
    protected Void doInBackground(Void... void) { 
       //do work
       myTask();
       return null;
    }

    @Override
    protected void onPostExecute(Void void) {
        super.onPostExecute();
        ringProgressDialog.dismiss();
    }
}

これが私のRxJavaの置き換えです:

    public static Observable<Void> getObservable(final Context context,final String... params) {

       return Observable.defer(new Func0<Observable<Void>>() {
          @Override
          public Observable<Void> call() {
             return Observable.just(myTask());
          }
       });

   }

    public static Subscriber<Void> getSubscriber() {
    Subscriber<Void> subscriber = new Subscriber<Void>() {
        @Override
        public void onCompleted() {
           ringProgressDialog.dismiss();

        }

        @Override
        public void onError(Throwable e) {
            Log.d(TAG,e.toString());

        }

        @Override
        public void onNext(Void aVoid) {
             manipulateData();

        }
    };
    return subscriber;
}

私の活動:

public class MainActivity extends Activity { 
   private ProgressDialog ringProgressDialog;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      GetNumberObservable.Observable()
                       .subscribeOn(Schedulers.io())
                       .observeOn(AndroidSchedulers.mainThread()))
                       .subscribe(getSubscriber());
   }
}

ProgressDialogを開始するAsyncTaskのonPreExecute()メソッドを模倣するにはどうすればよいですか?

9
Kristy Welsh
  • RxJavaには do 演算子があり、Observableライフサイクルイベントリスナーを作成します。この場合、タスクの開始前に何か​​を実行(UIを更新)する必要があります。つまり、 doOnSubscribeイベント。 (補足として、サブスクライブされたときに作業を開始した 'cold' Observablesの場合も同様です)mainThreadで通知を受け取るには、doOnSubscribeの前に.observeOn(AndroidSchedulers.mainThread()))を呼び出すように注意してください。 、UIを更新しているとき。
  • deferjustの両方を使用する代わりに

    return Observable.defer(new Func0<Observable<Void>>() {
         @Override
         public Observable<Void> call() {
            return Observable.just(myTask());
         }
      });  
    

    fromCallableを使用できます:

        Observable.fromCallable(new Callable<Object>() {
           @Override
           public Object call() throws Exception {
               return myTask();
           }
       })
    
3
yosriz

これが私がそれをする方法です:

public final class ProgressOrResult<T> {
    final int progress;
    final T result;
    public ProgressOrResult(int progress, T result) {
        this.progress = progress;
        this.result = result;
    }
}

ProgressDialog ringProgressDialog = ProgressDialog.show(
    context, "MyProgressBarTitle", "Working please wait", true, false);                  


Observable.fromEmitter((Emitter<ProgressOrResult> emitter) -> {
    // generate "progress"
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
        sum += i;
        emitter.onNext(new ProgressOrResult(i, null));
        Thread.sleep(1);
    }
    // generate "result"
    emitter.onNext(new ProgressOrResult(100, sum));
    emitter.onComplete();

}, BackpressureMode.BUFFER)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
    if (pr.result == null) {
        ringProgressDialog.setProgress(pr.progress);
    } else {
        ringProgressDialog.dismiss();        

        // process the result here
    }
}, error -> {
    // handle error here
})
4
akarnokd

progressBar indoOnSubscribe()を表示し、doOnError()subscribe()に隠れています。

詳細については、 this リンクを参照してください。

1
Levon Petrosyan

恥知らずなプロモーション

私が作成した RxLoadingライブラリ そのために、これとはるかに多くのことができます、

あなたはこのようなことをすることができます:

networkCall().compose(RxLoading.<>create(loadingLayout)).subscribe(...);

これは、カスタムビュー(loadingLayout)とRxLoadingの2つのクラスで構成されています。これは、すべてを結合する transformer であり、両方またはいずれかで作業することを選択できます。シンプルなプログレスバーを備えたRxLoadingが必要な場合は、インターフェイスを実装するだけで完了です。

詳細については、 GitHubページ で確認できます。

0
ndori