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。
答案 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之间的区别