這是我所做的解決我的問題。 我創建了異步任務和內存緩存我的結果。
我的適配器檢查圖像是否已經存在。如果是的話。然後我們跳過後臺工作。否則,我做異步任務,並嘗試加載圖像。我們也標記視圖,以防止用戶在任務未完成時滾動。
這有助於我們檢查標記是否與任務有所不同。如果它是相同的。然後,我們可以安全地將正確的圖像放在imageview中。從我的適配器
片段
@Override
public void onBindViewHolder(PostVideoRecyclerViewHolder holder, int position) {
holder.mImageView.getLayoutParams().width = mScreenWidth/mMaxItemsOnScreen;
holder.mImageView.setImageDrawable(null);
int second = position * 3 - 3;
String TAG = String.valueOf(second);
holder.mImageView.setTag(TAG);
Bitmap bitmap = mFragment.getBitmapFromMemCache(TAG);
if(bitmap == null) {
PostVideoBitmapWorkerTask task = new PostVideoBitmapWorkerTask(holder.mImageView, TAG, mFragment);
task.execute(second);
}
else {
holder.mImageView.setImageBitmap(bitmap);
}
}
我的AsyncTask類
public class PostVideoBitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private ImageView mImageView;
private String TAG;
private PostVideoFeedFragment mFragment;
public PostVideoBitmapWorkerTask(ImageView imageView, String TAG, PostVideoFeedFragment fragment) {
mImageView = imageView;
this.TAG = TAG;
mFragment = fragment;
}
@Override
protected Bitmap doInBackground(Integer... params) {
Bitmap bitmap = mFragment.getFrameFromCurrentVideo(params[0]);
mFragment.addBitmapToCache(TAG,bitmap);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if(mImageView.getTag().toString().equals(TAG)) {
mImageView.setImageBitmap(bitmap);
}
}
}
從我的片段類片段
public void addBitmapToCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
mMemoryCache.put(key, bitmap);
}
}
public Bitmap getBitmapFromMemCache(String key) {
return mMemoryCache.get(key);
}
我可以推薦https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html,如果你想在緩存
而且還https://developer.android.com/reference/android/os/AsyncTask.html宣讀了對閱讀了的AsyncTask的
我不知道。您是否嘗試使用Glide加載圖像?滑翔自動緩存圖像。 –