2016-04-02 10 views
0

Görselleri Listele'ye dönüştürmek için geri dönüştürücü görünümü kullanıyordum, ancak önbelleğe alma işleminden sonra bile hantal oluyordu. Bu yüzden Glide kütüphanesini kullanmaya karar verdim ama yine de cehennem gibi cıvıl cıvıl. Sonunda sadece tek bir çekilişle kontrol etmeyi düşündüm ve yine de bir laggy. Ben neden anlamıyorum. Lütfen yardım et. İşte kod. Hala fazla kod yok. Resim Görüntüleme özelliğim için kullandığım kodu görebiliyorsunuz.Laggy Recycler Herhangi bir kod olmadan bile görüntüle?

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


} 

}

Hala onun sadece bir tane bulunduğunu yükleme Bitmap ama biliyorum. Bu fazla gecikme yapmamalıydı. Ve evet, Glide yerine normal setImageBitmap'i kullandım ama yine de laggy. Görüntüleyici var. Sadece basit işlev. Ve daha önce bunun için uygun bir düzen kullanıyordum, ama aynı zamanda çalışmadı. Bunun içinde, sadece Düzen'de bir sorun olup olmadığından emin olmak için New ImageView() ve setParamaters kullanmıştım.

Lütfen Yardım için başvurunuz. Tipik Adaptörün neden Lag oluşturduğunu anlamıyorum.

Orijinal 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"); 
} 

}

Ben de denenmiş ve UI iş parçacığı üzerinde fazla görev olmadığından emin olmak için kaldırılabilir aramaların en fazla kaldırdık.

+0

Lütfen kaynak kodunu metin olarak değil, resim olarak gönderin. Bunun ötesinde, zamanınızı nerede harcadığınızı tam olarak belirlemek için yöntem izleme özelliğini kullanın. – CommonsWare

+0

Yöntem izlemeyi kullandım ama anlayamadım. Ben de acemiyim. Ve bekle, orijinal kodu güncelledim –

+0

ana kod güncellendi. Ve SysTrace kullandım ve görüntüleyicinin bağının çok fazla zaman aldığını söyledi. Ama bilmiyorum ki, o kadar fazla zaman alıyor ki, o zaman o kadar fazla yükü olmayan tek bir kod olduğu zaman. –

cevap

1

Ana uygulama iş parçacığı üzerinde disk G/Ç işlemi yaygın bir "jank" kaynağıdır, çünkü G/Ç zaman alabilir. StrictMode, ana uygulama iş parçacığı üzerinde disk G/Ç yaptığınızı belirlemenize yardımcı olabilir. Genel olarak, model verilerinizi (ör., Bir dosya listesi) arka plan iş parçacığına yüklemek ve daha sonra ana uygulama iş parçacığındaki bu model verilerinin bellek içi temsilciliğini kapatmak istiyorsunuz.

İlgili konular