2016-07-26 106 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的