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()メソッドを模倣するにはどうすればよいですか?
Observable
ライフサイクルイベントリスナーを作成します。この場合、タスクの開始前に何かを実行(UIを更新)する必要があります。つまり、 doOnSubscribe
イベント。 (補足として、サブスクライブされたときに作業を開始した 'cold' Observablesの場合も同様です)mainThreadで通知を受け取るには、doOnSubscribe
の前に.observeOn(AndroidSchedulers.mainThread()))
を呼び出すように注意してください。 、UIを更新しているとき。defer
とjust
の両方を使用する代わりに
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();
}
})
これが私がそれをする方法です:
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
})
progressBar
indoOnSubscribe()
を表示し、doOnError()
とsubscribe()
に隠れています。
詳細については、 this リンクを参照してください。
恥知らずなプロモーション
私が作成した RxLoadingライブラリ そのために、これとはるかに多くのことができます、
あなたはこのようなことをすることができます:
networkCall().compose(RxLoading.<>create(loadingLayout)).subscribe(...);
これは、カスタムビュー(loadingLayout)とRxLoadingの2つのクラスで構成されています。これは、すべてを結合する transformer であり、両方またはいずれかで作業することを選択できます。シンプルなプログレスバーを備えたRxLoadingが必要な場合は、インターフェイスを実装するだけで完了です。
詳細については、 GitHubページ で確認できます。