Laggy Recycler View甚至没有任何代码?

时间:2016-04-02 19:15:16

标签: android android-recyclerview lag

我正在使用回收站视图来列出图像,但是在缓存之后它变得很迟钝。所以我决定使用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);
    }


}

}

我知道有一个加载Bitmap但仍然只有一个。这不应该造成那么多的滞后。是的,我使用了典型的setImageBitmap而不是Glide,但仍然是滞后的。 有视图持有人。简单的功能。我之前使用的是适当的布局,但它不能正常工作。在这里,我刚刚使用New ImageView()和setParamaters来确定布局中是否存在问题。

请帮助。我不知道为什么典型的适配器会产生滞后。

原始主要活动

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线程上没有太多任务。

1 个答案:

答案 0 :(得分:1)

在主应用程序线程上执行磁盘I / O是&#34; jank&#34;的常见来源,因为I / O可能需要一些时间。 StrictMode可以帮助您确定在主应用程序线程上执行磁盘I / O的位置。

通常,您希望在后台线程上加载模型数据(例如,文件列表),然后在主应用程序线程上处理该模型数据的内存中表示。