需要帮助将AsyncTask转换为RxJava

时间:2015-12-02 14:56:58

标签: android android-asynctask rx-java

我今天潜入RxJava。

我有一个将图像转换为位图的AsyncTask并将其设置为Imageview。

我想将我的AsyncTask转换为RxJava

这是我在下面的AsyncTask工作:

String imageurl = "http://example.com/image.jpg";

new AsyncTask<String, Void, Void>() {
            Bitmap theBitmap = null;
            @Override
            protected Void doInBackground(String... params) {
                String TAG = "Message: ";

                try {
                    theBitmap = Glide.
                            with(mContext).
                            load(mValues.get(params[0]).
                            asBitmap().
                            into(-1, -1).
                            get();

                } catch (final ExecutionException e) {
                    Log.e(TAG, e.getMessage());
                } catch (final InterruptedException e) {
                    Log.e(TAG, e.getMessage());
                } catch (final NullPointerException e) {
                    Log.e(TAG, e.getMessage());
                }
                return null;
            }
            @Override
            protected void onPostExecute(Void dummy) {
                if (null != theBitmap) {
                    ImageView mImageView = (ImageView) findViewById(R.id.image);
                    mImageView.setImageBitmap(theBitmap);
                }
            }
        }.execute(imageurl);

我知道我想提供我尝试过的代码,但是我在试图绕过RxJava时遇到了问题。我只需要一些东西开始。

我看到这个示例代码,使用Just where It将Integers传递给onNext()函数。 http://reactivex.io/documentation/operators/just.html

Observable.just(1, 2, 3)
          .subscribe(new Subscriber<Integer>() {
        @Override
        public void onNext(Integer item) {
            System.out.println("Next: " + item);
        }

        @Override
        public void onError(Throwable error) {
            System.err.println("Error: " + error.getMessage());
        }

        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }
    });

请问,我怎样才能转换这段代码,所以我可以像AsyncTask一样使用它

2 个答案:

答案 0 :(得分:3)

这样的事情:

mSubscription = Observable.defer(new Func0<Observable<Bitmap>>() {
    @Override
    public Observable<Bitmap> call() {
        return Observable.just(getBitmap(imageurl));
    }
})
        .filter(new Func1<Bitmap, Boolean>() {
            @Override
            public Boolean call(Bitmap bitmap) {
                return bitmap != null;
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<Bitmap>() {
            @Override
            public void onCompleted() {}

            @Override
            public void onError(Throwable throwable) {
                Log.e(TAG, e.getMessage());
            }

            @Override
            public void onNext(Bitmap bitmap) {
                ImageView mImageView = (ImageView) findViewById(R.id.image);
                mImageView.setImageBitmap(bitmap);
            }
        });

/* later in onDestroy(), onStop(), etc */
if (mSubscription != null && !mSubscription.isUnsubscribed()) {
    mSubscription.unsubscribe();
}

答案 1 :(得分:0)