【发布时间】:2017-03-01 20:58:08
【问题描述】:
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。
【问题讨论】:
-
可能是由于
createVideoRx上的竞争条件;看起来您在多个线程之间共享同一个实例,而不是发送不可变数据,例如缩略图本身到 GUI 线程。 -
您希望在 io 线程上完成哪些代码块?
-
我希望我可以在 io 线程中执行第一个块。但是今天早上注意到两者都在 main 中执行。
-
什么是
mAdapter.getPublisher()? -
添加了更多信息
标签: android rx-java rx-android