2016-07-26 22 views
3

少し問題があります。正しい方向に軽く動かす必要があります。 私はVineやInstagramのようなビデオエディタをやっています。ビデオのスクリーンキャプチャを含むタイムラインを表示する場所 enter image description hereRecyclerViewと非同期読み込み

動画の再生時間に応じて写真が追加されます。私のアプリで何をしたのは、私がrecyclerViewを追加したことです。このrecyclerviewはこれが動作し、それは私がしたい画像の適切な量を追加し

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

onBindViewHolder次の関数たびに呼び出して、アダプタを持っています。しかし、問題はUIスレッドでは重すぎるということです。 recyclerViewはすべてをリサイクルしているからです。それはフレームを取得する必要があるたびに遅れます。

私はいくつかの非同期タスクを実行してからイメージをキャッシュしなければならないと思っていました。しかし、私が読んだのは、AsyncTaskはリサイクルされて以来、リサイクルビューには推奨されていないということです。

パフォーマンスを強化するにはどうすればよいですか?いいアイデア?

+0

上に読み取るためのキャッシング

https://developer.android.com/reference/android/os/AsyncTask.html上に読みたい場合は、私はよく分からないhttps://developer.android.com/training/displaying-bitmaps/cache-bitmap.htmlをお勧めすることができます。グライドを使ってイメージをロードしようとしましたか?グライドは画像を自動的にキャッシュします。 –

答えて

5

これは私の問題を解決するためのものです。 私は非同期タスクとメモリキャッシュを作成しました。

アダプターは、イメージがすでに存在するかどうかをチェックします。もしそうなら。その後、私たちはバックグラウンド作業をスキップします。それ以外の場合は、私は非同期タスクを行い、イメージを読み込もうとします。また、タスクが終了していない間にユーザーがスクロールした場合にのみ、ビューにタグを付けます。

これは、タグがタスクと異なるかどうかを確認するのに役立ちます。それが同じ場合。それから、正しいイメージをイメージビューに安全に置くことができます。私のアダプタから

スニペット

@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); 
    } 

私はあなたがasyncTaskの

関連する問題