ListView 性能缓慢

2024-03-11

我有一个习惯ListView我在那里展示了一些从本地数据库检索到的武器。我总共有 88 行,每行每次设置一个文本和一个图像getView()叫做。这ListView快速滚动时会出现滞后,垃圾收集器会变得疯狂,每秒删除一些 1M 对象。我不明白为什么。

在我发布我的Adapter实现,一些关于如何设置图像的解释。我的Weapon类只是一个带有 setter 和 getter 的数据持有者。这就是创建数据库时设置名称和图像的方式(是的,这可能看起来很奇怪,但所有其他解决方案的工作速度甚至更慢):

    private Weapon buildWeapon(Cursor cursor) {
    Weapon w = new Weapon();
    w.setId(cursor.getLong(0));
    w.setName(cursor.getString(1));
    w.setImage(Constants.ALL_WEAPON_IMAGES[(int) cursor.getLong(0)-1]);


    return w;
}

所以我有一个Array包含以下形式的所有武器图像R.drawable.somegun。数据结构的实现方式是 ID-1 始终指向我的中正确的可绘制引用Array。 Weapon 类中的图像字段是Integer。现在你知道我的getImage()方法有效,下面是我的Adapter:

 public class Weapon_Adapter extends BaseAdapter {
private List<Weapon> items;
private LayoutInflater inflater = null;
private WeaponHolder weaponHolder;
private Weapon wp;


static class WeaponHolder {
    public TextView text;
    public ImageView image;
}

// Context and all weapons of specified class are passed here

public Weapon_Adapter(List<Weapon> items, Context c) {
    this.items = (List<Weapon>) items;
    inflater = LayoutInflater.from(c);
    Log.d("Adapter:", "Adapter created");
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Weapon getItem(int position) {
    return items.get(position);
}


@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    wp = (Weapon) getItem(position);

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.category_row, null);
        weaponHolder = new WeaponHolder();
        weaponHolder.text = (TextView) convertView
                .findViewById(R.id.tvCatText);
        weaponHolder.image = (ImageView) convertView
                .findViewById(R.id.imgCatImage);
        convertView.setTag(weaponHolder);
    }

      weaponHolder = (WeaponHolder) convertView.getTag();   


    weaponHolder.text.setText(wp.getName());
    weaponHolder.image.setImageResource(wp.getImage());
           // weaponHolder.image.setImageResource(R.drawable.ak74m);




    return convertView;

}}

现在奇怪的是:使用注释行为所有项目静态设置相同的图像消除所有滞后和 GC,甚至没有调用一次!我不明白..wp.getImage()返回完全相同的东西,只是R.drawable.name每种武器都不同。但是 GC 会删除大量对象,并且ListView滚动时滞后。有什么想法我做错了吗?

UPDATE

我已将设置图像移至AsyncTask现在滞后消失了:

    public class AsyncImageSetter extends AsyncTask<Void, Void, Void> {

private ImageView img;
private int image_resId;
private Bitmap bmp;
private Context c;

public AsyncImageSetter(Context c, ImageView img, int image_ResId, Bitmap bmp) {

    this.img = img;
    this.image_resId = image_ResId;
    this.bmp = bmp;
    this.c = c;

}

@Override
protected Void doInBackground(Void... params) {

    bmp = BitmapFactory.decodeResource(c.getResources(), image_resId);

    return null;
}

@Override
protected void onPostExecute(Void result) {

    img.setImageBitmap(bmp);
    bmp = null;

    super.onPostExecute(result);
}

   }

然而,GC 仍然被疯狂地调用,并且当上下滚动整个 List 时 RAM 消耗会增加。现在的问题是:如何优化图像回收以避免 RAM 使用量增加?


由于将所有位图加载到 Android 内存中通常是不切实际的,因此您应该假设您会时不时地收到 GC。

但是,您可以考虑以下提示:

  1. 将位图缩小到您需要显示的尺寸。您可以使用谷歌的方式 http://developer.android.com/training/displaying-bitmaps/index.html or my way https://stackoverflow.com/a/17773344/878126.

  2. 检查您放置图像文件的文件夹。许多人将它们放在 res/drawable 文件夹中,但不明白为什么它们比原始尺寸大得多(这是因为密度 - 它是 mdpi,而设备可能是 xhdpi 或 xxhdpi)。

    例如,如果图像位于可绘制文件夹中,并且您在 xhdpi 设备(如 Galaxy S3)上运行它,则它将占用 (WIDTH*2)*(HEIGHT*2)*4 个字节。如果图像为 200x200 ,则其位图对象将至少占用 400*400*4=640,000 字节。在 xxhdpi 设备上情况会更糟,例如 Galaxy s4 和 htc one 。

  3. 考虑使用内存缓存,例如LruCache http://developer.android.com/reference/android/util/LruCache.html

  4. 如果位图没有透明度,并且您没有看到任何质量差异,请考虑使用RGB_565 配置 http://developer.android.com/reference/android/graphics/Bitmap.Config.html而不是默认的。这将需要每个像素 2 个字节,而不是每个像素 4 个字节。

  5. 如果你足够负责的话,你可以使用JNI来进行缓存。我为这个任务编写了一个小代码,here https://stackoverflow.com/questions/18250951/jni-bitmap-operations-for-helping-to-avoid-oom。请阅读我在那里写的所有笔记。

顺便说一句,我注意到您使用了图像的标识符数组。如果图像的名称中有一些逻辑(例如:img1,img2,...),您可以使用 getResources().getIdentifier(...) 代替。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ListView 性能缓慢 的相关文章

随机推荐

  • 将图像转换为 pdf php

    我在用csxi http www chestysoft com ximage twainupload asp将文档扫描为图像 但我必须将 pdf 文件上传到服务器 如何在 php 中将图像转换为 PDF 或者有什么方法可以让 csxi 将文
  • 用于应用程序本地部署的 MSVC 2015 通用 CRT

    据宣布 通用 CRT 将是一个可重新分发的 DLL 这样应用程序本地部署仍然是可能的 我已经安装了 Visual Studio 2015 Express Edition 并且在 SDK 目录中查找 ucrtbase dll 但找不到任何内容
  • 如何添加第三方 Java JAR 文件以在 PySpark 中使用

    我有一些 Java 第三方数据库客户端库 我想通过访问它们 java gateway py 例如 要使客户端类 不是 JDBC 驱动程序 通过 Java 网关可供 Python 客户端使用 java import gateway jvm o
  • 将压缩半字节组合成压缩字节

    给定一个或多个 m128i or m256i每个 16 位元素包含一个半字节 将它们组合并打包为每个 8 位元素一个字节的最快方法是什么 即 hi lt lt 4 lo对于相邻的 16 位元素 这是我想出的最好方法 不幸的是它与标量代码相当
  • 如果内容太宽,请在 HTML 标记中插入省略号 (...)

    我有一个具有弹性布局的网页 如果调整浏览器窗口的大小 该网页会更改其宽度 在这个布局中有标题 h2 其长度可变 实际上是我无法控制的博客文章的标题 目前 如果它们比窗口宽 它们会分成两行 是否有一个优雅的 经过测试的 跨浏览器 解决方案 例
  • 如何在IOS的UIView中仅使文本/标题覆盖的部分透明

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试创建一个UIView with text the text可能会不断变化 在其之上 我只想要text其中的一部分UIView透明
  • 模拟对象上的异步回调不等待

    我试图模拟单元测试的复杂情况 mockController new Mock
  • 无法连接到 (LocalDB)\MSSQLLocalDB -> 用户“User-PC\User”登录失败

    当我尝试通过 SQL Server Management Studio 连接 LocalDB MSSQLLocalDB 时 出现错误 我还尝试使用默认数据库作为 master 登录 错误是相同的 Here is the Server det
  • JavaScript 中的嵌套层数是否有限制?

    假设您有一个非常复杂的算法 需要数十个 for 循环 JavaScript 对循环的嵌套深度有限制还是没有限制 深层嵌套 for 循环的最佳实践是什么 我尝试在 MDN 上搜索 但找不到我要找的内容 Edit 我正在寻找是否有内置限制 例如
  • Java - 接口扩展自身

    我已经使用这个网站大约 6 个月了 是时候问我的第一个问题了 因为我找不到这个问题的答案 至少不是我能理解的答案 在这段代码中 为什么这个接口要扩展自身 public interface PositionedVertex
  • DecorView子框架布局

    有人可以向我解释一下 为什么我的布局上的 DecorView 的子级是 FrameLayout 而我还没有定义它 这是xml布局
  • 观察者模式是否违反了单一责任原则?

    如果使用观察者设计模式的应用程序具有subject具有以下职责的类 1 管理和通知观察者 即提供注册和注销函数并调用所有观察者通知函数 和 2 它最初的责任 即班级在成为班级之前正在做什么subject 这个类是否违反了单一职责原则 它显然
  • jsPDF 不完整或损坏的 PNG 文件

    使用 jsPDF 添加常规 png 图像没有问题 但现在我从服务器发送生成的图像 并且浏览器控制台在渲染 PDF 文件时显示此错误 PNG 文件不完整或损坏 显然图像不是不完整或损坏的 因为我可以看到服务器的响应并且图像很好 另外 为了避免
  • 函数参数列表中的三个点是什么意思?

    我遇到了这样的函数定义 char abc char f 三个点是什么意思 这些类型的函数称为可变参数函数 维基百科链接 https en wikipedia org wiki Variadic function 他们使用省略号 即三个点 来
  • Linux perf 中的运行时间和报告的周期计数

    我在 4 核 Intel CPU 每个核心 1 个线程 上运行了单线程矩阵乘法 但 perf 中的数字没有意义 Performance counter stats for system wide 31 728 397 287 cpu cyc
  • 使用 Poco 和 Boost C++ 的多个 Http 服务器

    我正在尝试使用 Poco Net 和 Boost 库创建多个 Http 服务器 但在 Poco 文件内部出现以下错误应用程序 cpp Assertion violation pInstance 0 in file src Applicati
  • 无法安装渐进式网络应用程序网站:没有可显示的图标

    我正在构建一个渐进式网络应用程序 我从样板开始创建反应应用程序 https github com facebookincubator create react app 然后我添加了一个网络应用程序清单 应用程序 公共 manifest js
  • Selenium Webdriver C# 无需等待页面加载

    我有以下场景 我想导航到一个页面 然后 一旦出现按钮就单击它 不等待页面加载 我不想等待初始页面加载 因为这需要很长时间 我的程序目前卡住 直到页面加载然后单击按钮 我基本上想导航到链接 然后无需等待页面并继续我的代码 无论如何还有这个吗
  • Bootstrap 手风琴箭头颜色 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我怎样才能改变颜色崩溃了手风琴箭头 我尝试了更多解决方案 但我设法仅更改按钮的文本颜色 恒定的颜色是蓝色 与深色背景根本不兼容 例子
  • ListView 性能缓慢

    我有一个习惯ListView我在那里展示了一些从本地数据库检索到的武器 我总共有 88 行 每行每次设置一个文本和一个图像getView 叫做 这ListView快速滚动时会出现滞后 垃圾收集器会变得疯狂 每秒删除一些 1M 对象 我不明白