Tyl*_*aff 2 android android-asynctask rx-java rx-android
我正在尝试学习RxJava,我正在转换AsyncTask我必须是一个Observable/Subscriber.原始AsyncTask图像在后台加载,然后将ImageView的drawable设置为加载的图像onPostExecute.显示的图像位于recyclerview中,当列表滚动时,将为列表中的每个项目加载图像.我将它转换为Rx,但现在滚动时存在很多延迟.fetchThumbnail每次onBind调用该方法都在RecyclerView的适配器中调用.下面您将看到我的原始实现已注释掉,以及新的实现.我发现使用RxJava时内存或CPU使用率没有显着增加.我相信我也在订阅和观察正确的线程.是什么赋予了?
public class ThumbnailWorker {
public static void fetchThumbnail(final Context context, final GalleryItem galleryItem, final int thumbId, final ThumnailFetchedListener completionListener) {
galleryItem.thumbnail.setImageBitmap(null);
galleryItem.progressBar.setVisibility(View.VISIBLE);
Observable.just(MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(),
thumbId
, MediaStore.Video.Thumbnails.MINI_KIND,
null))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
completionListener.thumbnailFetched(galleryItem, bitmap, thumbId);
galleryItem.progressBar.setVisibility(View.GONE);
}
});
//
// new AsyncTask<Void,Bitmap,Bitmap>() {
//
//
// @Override
// protected void onPreExecute() {
// super.onPreExecute();
// galleryItem.thumbnail.setImageBitmap(null);
// galleryItem.progressBar.setVisibility(View.VISIBLE);
// }
//
// @Override
// protected Bitmap doInBackground(Void... params) {
// Bitmap bitmap = MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(),
// thumbId
// ,MediaStore.Video.Thumbnails.MINI_KIND,
// null
// );
//
// return bitmap;
// }
//
//
// @Override
// protected void onPostExecute(Bitmap bitmap) {
// super.onPostExecute(bitmap);
// completionListener.thumbnailFetched(galleryItem, bitmap,thumbId);
// galleryItem.progressBar.setVisibility(View.GONE);
//
// }
// }.execute();
}
}
Run Code Online (Sandbox Code Playgroud)
这就是听众正在做的事情.侦听器回调适配器.
@Override
public void thumbnailFetched(GalleryItem item, Bitmap thumbnail, int thumbId) {
if(thumbId == item.id) {
item.thumbnail.setImageBitmap(thumbnail);
}
}
Run Code Online (Sandbox Code Playgroud)
Observable.just 可用于已计算的值.
我假设此调用MediaStore.Video.Thumbnails.getThumbnail(...)处理您的图像,因此可能会滞后您的UI.你必须推迟你的电话.为此,您可以使用Observable.fromCallable:
Observable.fromCallable(() -> MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(), thumbId , MediaStore.Video.Thumbnails.MINI_KIND, null))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bitmap -> {
completionListener.thumbnailFetched(galleryItem, bitmap, thumbId);
galleryItem.progressBar.setVisibility(View.GONE);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2042 次 |
| 最近记录: |