2017-02-19 78 views
5

我想在android中用RxJava替換我的AsyncTask。我現在的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()); 
    } 
} 

如何模仿onPreExecute()方法中的AsyncTask,我啓動progressDialog?

+0

使用doOnNext()方法 – Tuby

+0

@Tuby你如何做到這一點? –

+0

查找此類https://github.com/TwistedEquations/android-rxmvp-tutorial/blob/master/app/src/main/java/com/twistedeqations/rxmvp/sample/activities/home/mvp/HomePresenter.java,它使用doOnNext將showLoading設置爲true,這將啓用進度條,您可以在此方法中調用ringProgressDialog.show()。 – Tuby

回答

3
  • 在RxJava你有do運營商,創建Observable 生命週期事件監聽器,你的情況,你想要做的事 (更新UI)任務開始前,你想的 doOnSubscribe事件,這意味着什麼。 (側面說明,它與「冷」真觀測 時subscrbied到開始thier工作 - 像你的情況下)只是 提防爲了 的doOnSubscribe之前調用.observeOn(AndroidSchedulers.mainThread()))就要上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(); 
         } 
        }) 
    
1

這裏是我會怎麼做:

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 
}) 
0

無恥促進

我爲創建RxLoading library,它可以做到這一點,更,

你可以做這樣的事情:

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

它包含了2班,自定義視圖(loadingLayout)和RxLoading,這是一個將所有內容粘合在一起的transformer,您可以選擇使用兩者或其中之一。 如果您想要使用簡單的進度條進行RxLoading,您只需實現一個界面即可完成。

你可以在GitHub page上查看更多。