2016-04-02 4 views
0

私はリサイクラビューをリストイメージに使用していましたが、キャッシングしてもすべてが遅れていました。だから私はGlideライブラリを使うことにしましたが、まだ地獄のように遅れています。私は最終的にただ一つのドロアブルでチェックすることを考えていましたが、まだ遅いです。私は理由を知りません。助けてください。ここにコードがあります。まだコードはあまりありません。あなたは私の画像閲覧のために使用していたコードをコメントアウトして見ることができます。遅いリサイクルコードなしでも表示できますか?

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageHolder> 
{ 
private File file; 
private String logging=getClass().getSimpleName(); 
private int size; 
private MemCache memCache; 
private Context context; 
private Bitmap bitmap; 
public ImageAdapter(File file,int Size,MemCache memCache,Context context) 
{ 
    this.file = file; 
    size=Size; 
    this.memCache=memCache; 
    this.context=context; 
    bitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.empty_photo); 
} 


@Override 
public ImageHolder onCreateViewHolder(ViewGroup parent, int viewType) 
{ 
    return new ImageHolder(new ImageView(context),size); 
} 

@Override 
public void onBindViewHolder(ImageHolder holder, int position) 
{ 
    Glide.with(context).load(R.drawable.empty_photo).into(holder.getImageView()); 
//  if (memCache.get(file.listFiles()[position].toString())!=null) 
//  { 
//   holder.getImageView().setImageBitmap(memCache.get(file.listFiles()[position].toString())); 
//  } 
//  else 
//  { 
//   ImageSyncTask imageSyncTask = new ImageSyncTask(size, holder.getImageView(),memCache); 
//   imageSyncTask.executeOnExecutor(imageSyncTask.THREAD_POOL_EXECUTOR, file.listFiles()[position]); 
//  } 
//  Glide.with(context).load(file.listFiles()[position]).crossFade().into(holder.getImageView()); 
} 
@Override 
public int getItemCount() 
{ 
    if (file!=null&&file.listFiles()!=null) return file.listFiles().length; 
    else return 0; 
} 













public static class ImageHolder extends RecyclerView.ViewHolder 
{ 
    private ImageView imageView; 
    public ImageHolder(View itemView,int size) 
    { 
     super(itemView); 
     imageView=(ImageView)itemView; 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setMinimumWidth(size); 
     imageView.setMinimumHeight(size); 
    } 
    public ImageView getImageView() 
    { 
     return imageView; 
    } 
    public void clearImage() 
    { 
     imageView.setImageResource(android.R.color.transparent); 
    } 


} 

}

私は1つの負荷ビットマップが、まだそのひとつが存在しているはず。それはあまり遅れてはいけません。そして、はい、私はGlideの代わりに典型的なsetImageBitmapを使用しましたが、まだ遅いです。 ビューホルダーがあります。ジャストシンプル機能。以前は適切なレイアウトを使っていましたが、うまく機能しませんでした。ここでは、新しいImageView()とsetParamatersを使ってレイアウトに問題があるかどうかを確認しています。

お願いします。私は典型的なアダプターが遅れを作り出している理由は分かりません。

オリジナルMainActivity

public class MainActivity extends AppCompatActivity 
{ 
RecyclerView recyclerView; 
int cnum; 
private MemCache memCache; 
private String logging=getClass().getSimpleName(); 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    DisplayMetrics displayMetrics=new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
    int maxmem=(int)Runtime.getRuntime().maxMemory()/1024; 
    int cache_mem=maxmem/10; 
    memCache=new MemCache(cache_mem); 
    int orientation=getResources().getConfiguration().orientation; 
    if (orientation== Configuration.ORIENTATION_PORTRAIT) 
    cnum=3; 
    else cnum=5; 
    recyclerView=(RecyclerView)findViewById(R.id.recycler_view); 
    recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(),cnum)); 
    recyclerView.setAdapter(new ImageAdapter(getGallery(),displayMetrics.widthPixels/cnum,memCache,getApplicationContext())); 
} 

private File getGallery() 
{ 
    return new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath(),"Trial"); 
} 

}

私も試したし、UIスレッド上で多くのタスクがないことを確認するために取り外すことができるコールの最大を削除しました。

+0

ソースコードを画像ではなくテキストとして投稿してください。それを超えて、メソッドトレースを使用して、時間を費やしている場所を正確に判断します。 – CommonsWare

+0

メソッドトレースを使用しましたが、わかりませんでした。私は初心者です。そして、元のコード –

+0

を編集してメインコードを更新しています。そして、私はSysTraceを使用しました。ビューホールダーのバインドには時間がかかりすぎていると言われました。しかし、あまりオーバーヘッドではない単なるコードでも、あまりにも多くの時間がかかることはわかりません。 –

答えて

1

メインアプリケーションスレッド上でディスクI/Oを実行することは、I/Oには時間がかかることがあるため、「ジャンク」の共通ソースです。 StrictModeを使用すると、メインのアプリケーションスレッドでディスクI/Oをどこで実行しているかを判断できます。

一般に、モデルデータ(ファイルのリストなど)をバックグラウンドスレッドにロードしてから、メインアプリケーションスレッドでそのモデルデータのメモリ内表現を処理したいとします。

関連する問題