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

Laggy Recycler View without even any code?

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


}

}

我知道有一个加载位图,但它仍然只有一个。那不应该造成那么大的滞后。是的,我使用了典型的 setImageBitmap 而不是 Glide,但仍然很慢。 有视图持有者。只是简单的功能。我之前使用了适当的布局,但效果不佳。在此我刚刚使用了 New 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 线程上没有太多任务。

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

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