2016-07-26 75 views
3

我有一個小問題。需要在正確的方向輕推。 我正在做一個像Vine和/或Instagram的視頻編輯器。他們在哪裏展示了視頻中的屏幕截圖的時間線 enter image description hereRecyclerView和異步加載

它只是根據視頻持續時間添加更多圖片。我爲我的應用做了什麼,我添加了recyclerView。這recyclerview具有調用下面的函數每次onBindViewHolder

public Bitmap getFrameFromCurrentVideo(int seconds) { 
    Bitmap bitmap = null; 
    if(mMediaMetadataRetriever != null) { 
     bitmap = mMediaMetadataRetriever.getFrameAtTime(seconds * 1000000, MediaMetadataRetriever.OPTION_CLOSEST); 
    } 
    return bitmap; 
    } 

這工作,並補充說,我想要的圖像適量的適配器。但問題是它在UI線程上太重了。由於recyclerView正在回收所有東西。它每次都必須得到一個框架纔會落後。

所以我認爲我必須做一些異步任務,然後緩存圖像。但我讀到的是,AsyncTask不建議用於回收視圖,因爲它可以回收利用。

那麼我該怎麼做才能提高性能呢?任何好主意?

+0

我不知道。您是否嘗試使用Glide加載圖像?滑翔自動緩存圖像。 –

回答

5

這是我所做的解決我的問題。 我創建了異步任務和內存緩存我的結果。

我的適配器檢查圖像是否已經存在。如果是的話。然後我們跳過後臺工作。否則,我做異步任務,並嘗試加載圖像。我們也標記視圖,以防止用戶在任務未完成時滾動。

這有助於我們檢查標記是否與任務有所不同。如果它是相同的。然後,我們可以安全地將正確​​的圖像放在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的