RxJava链调用滞后

时间:2017-02-27 21:50:13

标签: android rx-java rx-android

mDisposable = mAdapter.getPublisher()
.subscribeOn(Schedulers.io())
.map(new Function<CreateVideoRx, CreateVideoRx>() {

    @Override
    public CreateVideoRx apply(CreateVideoRx createVideoRx) throws Exception {
        Bitmap bitmap = mMediaMetadataRetriever.getFrameAtTime(createVideoRx.time * 1000000, MediaMetadataRetriever.OPTION_CLOSEST);
        bitmap = ThumbnailUtils.extractThumbnail(bitmap, 50, 90);
        createVideoRx.mBitmap = bitmap;
        return createVideoRx;
    }
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<CreateVideoRx>() {
    @Override
    public void accept(CreateVideoRx createVideoRx) throws Exception {
        createVideoRx.mImageView.setImageBitmap(createVideoRx.mBitmap);
    }
});

这个RxJava链工作正常。但我仍然做错了,因为它滞后了,并不觉得它在后台线程上工作。在这种情况下,将在IO线程中完成什么以及将在MainThread中完成什么?

我之前使用AsyncTask完成了这项工作。它工作正常但现在我想跳过它并使用RxJava代替。我的结果是工作但是它很多。

修改:添加了更多信息

  private final PublishSubject<CreateVideoRx> mPublisher = PublishSubject.create();

mAdapter.getPublisher()中调用上面的对象,函数本身看起来像

  public PublishSubject<CreateVideoRx> getPublisher() {
    return mPublisher;
  }

我想要做的是在后台线程上提取缩略图。然后,当它完成后,我希望它被推送到单个ImageView。

2 个答案:

答案 0 :(得分:1)

“在RxJava中,您可以使用subscribeOn()告诉您的Observable代码运行哪个线程,以及使用observeOn()”运行订阅服务器的线程。然而,由于运营商订阅了源可观察源,这很复杂。

我保持直线的方式是记住subscribeOn()会影响函数上游的所有内容,而observeOn会影响函数下游的所有内容。你在原来的问题中应该做的是

mDisposable = mAdapter.getPublisher()    
.map(new Function<CreateVideoRx, CreateVideoRx>() {

    @Override
    public CreateVideoRx apply(CreateVideoRx createVideoRx) throws Exception {
        Bitmap bitmap = mMediaMetadataRetriever.getFrameAtTime(createVideoRx.time * 1000000, MediaMetadataRetriever.OPTION_CLOSEST);
        bitmap = ThumbnailUtils.extractThumbnail(bitmap, 50, 90);
        createVideoRx.mBitmap = bitmap;
        return createVideoRx;
    }
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<CreateVideoRx>() {
    @Override
    public void accept(CreateVideoRx createVideoRx) throws Exception {
        createVideoRx.mImageView.setImageBitmap(createVideoRx.mBitmap);
    }
});

答案 1 :(得分:0)

        mDisposable = mAdapter.getPublisher()
            .observeOn(Schedulers.io())
            .map(new Function<CreateVideoRx, CreateVideoRx>() {
                @Override
                public CreateVideoRx apply(CreateVideoRx createVideoRx) throws Exception {
                    Bitmap bitmap = mMediaMetadataRetriever.getFrameAtTime(createVideoRx.time * 1000000, MediaMetadataRetriever.OPTION_CLOSEST);
                    bitmap = ThumbnailUtils.extractThumbnail(bitmap, 50, 90);
                    createVideoRx.mBitmap = bitmap;
                    return createVideoRx;
                }
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<CreateVideoRx>() {
                @Override
                public void accept(CreateVideoRx createVideoRx) throws Exception {
                    createVideoRx.mImageView.setImageBitmap(createVideoRx.mBitmap);
                }
            });

这解决了我的问题。但我仍然不完全理解SubscribeOn和ObserveOn之间的区别