2017-02-19 1 views
5

안드로이드에서 AsyncTask를 RxJava로 바꾸고 싶습니다. 나의 현재 AsyncTask를이 같이 간다 :AsyncTask와 같이 RxJava와 함께 진행률 표시 줄을 사용하고 싶습니다.

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()); 
    } 
} 

가 어떻게이 AsyncTask를에 onPreExecute() 메소드를 모방 할 어디 진전을 시작하세요. 다이얼로그? 당신이 do 사업자가 RxJava에서

+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
  • , 즉 당신이 doOnSubscribe 이벤트를 싶은 말은 당신이 작업이 시작되기 전에 (UI를 업데이트) 뭔가 을하려는 경우 Observable 라이프 사이클 이벤트 리스너를 만듭니다. 당신은 업데이트하고, 그냥 mainThread에 알림을받을하기 위해 doOnSubscribe 전에 .observeOn(AndroidSchedulers.mainThread())) 전화 조심 - (귀하의 경우처럼 측면은 '감기'와 사실에 subscrbied 때, 자신의 작업을 시작 을 관찰 가능한 주) 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(...); 

는이 개 클래스에서 구성 , 사용자 정의보기 (loadingLayout) 및 RxLoading (transformer)을 모두 붙이면 둘 다 또는 둘 다로 작업하도록 선택할 수 있습니다. 간단한 진행 표시 줄로 RxLoading을 원할 경우 인터페이스를 구현하기 만하면됩니다.

GitHub page에서 자세한 내용을 확인할 수 있습니다.