2017-02-19 9 views
5

के साथ कर सकते हैं मैं अपने AsyncTask को एंड्रॉइड में RxJava के साथ बदलना चाहता हूं। मेरे वर्तमान 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()); 
    } 
} 

मैं कैसे AsyncTask में onPreExecute() विधि की नकल करते हैं, जहां मैं प्रगति को दूर करो?

+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, यह showLoading को सत्य पर सेट करने के लिए doOnNext का उपयोग करता है, जो प्रगति पट्टी को सक्षम करता है, आप इस विधि में ringProgressDialog.show() को कॉल कर सकते हैं। – Tuby

उत्तर

3
  • RxJava में आप do ऑपरेटरों है, कि Observable जीवन चक्र की घटनाओं श्रोताओं, आपके मामले में आप कुछ करने के लिए (यूआई अद्यतन) से पहले काम शुरू कर दिया चाहते हैं, इसका मतलब यह है जो आप doOnSubscribe घटना चाहते हैं बनाता है। (पक्ष यह ठंड 'के साथ सच है कि उनके काम जब करने के लिए शुरू कर दिया subscrbied observables ध्यान दें - अपने मामले की तरह) बस क्रम में doOnSubscribe से पहले .observeOn(AndroidSchedulers.mainThread())) कॉल करने के लिए mainThread पर सूचना पाने के लिए सावधान रहना, के रूप में आप को अपडेट कर रहे यूआई।
  • इसके बजाय दोनों 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(); 
         } 
        }) 
    
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 वर्गों से बाहर होते हैं , एक कस्टम व्यू (लोडिंगआउटआउट) और आरएक्सलोडिंग जो transformer है जो इसे सभी को एक साथ चिपकाता है, आप दोनों या दोनों के साथ काम करना चुन सकते हैं। यदि आप एक साधारण प्रगति पट्टी के साथ आरएक्सलोडिंग चाहते हैं तो आपको केवल एक इंटरफेस को लागू करने की आवश्यकता है और आप कर चुके हैं।

आप GitHub page पर और अधिक जांच सकते हैं।

संबंधित मुद्दे