【问题标题】:Need Help Converting AsyncTask to RxJava需要帮助将 AsyncTask 转换为 RxJava
【发布时间】:2015-12-02 14:56:57
【问题描述】:

我今天深入研究了 RxJava。

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

我想将我的 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 将整数传递给 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 一样使用它

【问题讨论】:

  • 你需要在文档中进一步了解如何创建 observables 的部分

标签: android android-asynctask rx-java


【解决方案1】:

类似这样的:

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

【讨论】:

  • 请您不要使用 lambdas...我还不熟悉,我想如何将我的字符串作为参数传递给 getBitmap() 方法?
  • @HtmlTosin 已更新; gitBitmap() 只是一个放置 Glide 特定逻辑的地方
  • 嗨,它有效,但后来我不得不删除“mSubscription”变量并将其用作Observable.defer ...它说“找不到符号mSubscription”。为什么会这样?
  • 因为你没有在使用这个 observable 的类中定义这个字段?我以为问题不在于 Java 的基础知识。
  • 好吧,我猜你的意思是这个 - Subscription mSubscription
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 2018-11-24
  • 2019-12-23
  • 2021-11-06
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多