Convert AsyncTask to RxAndroid

后端 未结 3 1747
北恋
北恋 2021-02-04 03:02

I have the following method to post response to UI using otto and AsyncTask.

private static void onGetLatestStoryCollectionSuccess(final StoryColle         


        
相关标签:
3条回答
  • 2021-02-04 03:43

    Don't use .create() but use .defer()

    Observable<File> observable = Observable.defer(new Func0<Observable<File>>() {
      @Override public Observable<File> call() {
    
        File file = downloadFile();
    
        return Observable.just(file);
      }
    });
    

    to know more details see https://speakerdeck.com/dlew/common-rxjava-mistakes

    0 讨论(0)
  • 2021-02-04 03:46

    In your case you can use fromCallable. Less code and automatic onError emissions.

    Observable<File> observable = Observable.fromCallable(new Callable<File>() {
            @Override
            public File call() throws Exception {
                File file = downloadFile();
                return file;
            }
        });
    

    Using lambdas:

    Observable<File> observable = Observable.fromCallable(() -> downloadFile());
    
    0 讨论(0)
  • This is an example for a file download task using RxJava

    Observable<File> downloadFileObservable() {
        return Observable.create(new OnSubscribeFunc<File>() {
            @Override
            public Subscription onSubscribe(Observer<? super File> fileObserver) {
                try {
                    byte[] fileContent = downloadFile();
                    File file = writeToFile(fileContent);
                    fileObserver.onNext(file);
                    fileObserver.onCompleted();
                } catch (Exception e) {
                    fileObserver.onError(e);
                }
                return Subscriptions.empty();
            }
        });
    }
    

    Usage:

    downloadFileObservable()
      .subscribeOn(Schedulers.newThread())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(observer); // you can post your event to Otto here
    

    This would download the file on a new thread and notify you on the main thread.

    OnSubscribeFunc was deprecated. Code updated to use OnSubscribe insted. For more info see issue 802 on Github.

    Code from here.

    0 讨论(0)
提交回复
热议问题