我想學習RxJava,我正在轉換AsyncTask
我必須成爲Observable/Subscriber。原始AsyncTask
在後臺加載圖像,然後在onPostExecute
中將ImageView的drawable設置爲加載的圖像。顯示的圖像位於回收站視圖中,當列表滾動時,將爲列表中的每個項目加載一張圖像。我將它轉換爲Rx,但現在滾動時存在很多延遲。每次調用fetchThumbnail
的方法onBind
在RecyclerView的適配器中調用。下面你會看到我的原始實現註釋掉了,還有新的實現。使用RxJava時,內存或CPU使用率沒有明顯增加。我相信我正在訂閱並觀察正確的主題。是什麼賦予了?將圖像加載asynctask轉換爲rxjava,爲什麼它滯後於用戶界面?
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();
}
}
這是所有聽衆做。偵聽器回調到適配器。
@Override
public void thumbnailFetched(GalleryItem item, Bitmap thumbnail, int thumbId) {
if(thumbId == item.id) {
item.thumbnail.setImageBitmap(thumbnail);
}
}
如果有一件事,你似乎沒有在任何地方退訂。 – EpicPandaForce