ListView 与 getView() 由于不断的 GC 而变得缓慢?

2024-04-25

我的应用程序中有一个 ListView,并且我已经重写了 getView() 方法,因此我可以根据行的文本更改行的 ImageView src。

问题是,我注意到 ListView 滚动滞后,当我检查 DDMS 时,似乎每次滚动 ListView 时都会调用垃圾收集器,从而减慢滚动速度。

我还注意到,当从 BufferedReader 读取行时,垃圾收集器在我的应用程序的不同部分被调用,这使得打开一个 2,000 行的文件需要约 47 秒,而当我在手机上安装的文件浏览器打开时,大约 2 秒内即可生成相同的文件。

所以我的问题是,什么可能导致每隔 200 毫秒左右进行一次持续的垃圾收集,以及如何防止它?它确实减慢了我的应用程序的速度,我担心如果我不解决它,它会让一些用户望而却步。

谢谢, 亚历克斯.

ListView getView():

class IconicAdapter extends ArrayAdapter<String> {
  IconicAdapter(){
    super(FileBrowser.this, R.layout.filebrowser_listview_row, R.id.listtext, directoryEntries);
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent){
    View row = super.getView(position, convertView, parent);
    TextView text = (TextView) row.findViewById(R.id.listtext);
    ImageView icon = (ImageView) row.findViewById(R.id.listicon);

    entryFullFileName = directoryEntries.get(position).toString();

    if(entryFullFileName.contains(".") && !entryFullFileName.matches("^\\.+$")){
      String[] parts = entryFullFileName.split("\\.");
      lastIndex = parts.length - 1;
      fileType = parts[lastIndex];
    }else{
      fileType = "";
    }

     if(fileIsDir.get(position) == true){
      icon.setImageResource(R.drawable.folderlightblue);
     }else if(fileType.equals("html")){
      icon.setImageResource(R.drawable.filehtml);
     }else if(fileType.equals("css")){
      icon.setImageResource(R.drawable.filecss);
     }else if(fileType.equals("js")){
      icon.setImageResource(R.drawable.filejs);
     }else if(fileIsDir.get(position) == false){
      icon.setImageResource(R.drawable.fileplain);
     }

   return(row);
  }
}  

打开文件的代码

前几天我删除了记录打开文件花费了多少秒的代码,但它花了 47 秒,而且肯定花了太长时间,而且当 while 循环执行它的操作时,不断调用垃圾收集器,这我猜测文件读取速度慢的原因 - 是的,这个函数是在一个线程中调用的,并且在读取文件时显示 ProgressDialog

private String getLocalFileContents(String fileUri){
  try{
    String contents = "";
    BufferedReader in = new BufferedReader(new FileReader(fileUri));
    String line;
    while((line = in.readLine()) != null){
      contents += line + "\n";
    }
    in.close();

    return contents;
  }catch(Exception e){
    toast.setText("Failed to open sdcard file, try again.");
  }
 return null;
}

UPDATE:

文件读取问题得到了解决,事实证明字符串连接使垃圾收集器在每次循环后被调用,从而大大减慢了文件读取速度。正如答案所建议的,我使用 StringBuilder 代替,它现在立即打开 - 万岁!

第二次更新:

我知道滚动 ListView 时不断调用 GC 的原因是什么,它是 ListView 属性 android:cacheColorHint="@android:color/transparent" - 但我不知道解决方法!


一般来说,垃圾收集的发生是因为您不必要地创建了太多对象。帮助您的代码会更容易,但无论如何我都会尝试一下。

就您的列表而言,您可能会在每次调用时重新创建视图getView。你应该重新使用convertView在适当的时候。看我的answer https://stackoverflow.com/questions/7068932/android-how-to-know-which-check-box-is-selected/7069507#7069507对于另一个 SO 问题,了解如何构建您的getView method.

你的文件读取问题有点难以猜测,但 47s 对于 2,000 行来说似乎长得可笑。您还在该循环中创建对象吗?

Update:

所以显然你的问题并不在于你View对象本身,但这就是您每次获得对象时所做的所有工作View。您每次都要做相当多的工作:正则表达式匹配、字符串拆分(以及关联的字符串对象创建)等。您至少应该缓存其结果,这样您就不必为每个操作重做工作项目每次返回视图时。

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

ListView 与 getView() 由于不断的 GC 而变得缓慢? 的相关文章

  • Android 在连接 Socket 时出现错误

    在阅读了一些express io文档并成功连接到之后 我尝试使用nodejs和express io编写简单的应用程序http chat socket io在命令行中运行下面的代码并打开后 我找到了使用 nodejs 和express io
  • 如何生成带logo的二维码?

    我正在为 Android 设备开发应用程序 我想生成带有徽标的二维码 With ZXing I know how to generate simple QR codes like this one But I want to generat
  • 模拟器的窗口比手机屏幕太大

    我做了一个小例子来测试我的Android环境 当我在AVD上启动执行时 它看起来太大了 就好像它是平板电脑屏幕一样 如何调整大小使其看起来像手机屏幕 Android Studio 2 2更新后就没有了Emulator Tab in Edit
  • 是否可以在 Flutter 中创建自定义快速设置图块?

    我搜索了 Flutter 文档并用谷歌搜索了这个 但结果为零 我正在开发我的第一个 Android Flutter 应用程序 我想为其创建一个自定义的快速设置图块 我的目标是牛轧糖及以上 我知道这在 Java 和 Kotlin 中是可能的
  • 如何转到材料日历视图中选定的日期?

    我在用着材料日历视图 https github com prolificinteractive material calendarview在我的项目中 我可以使用 setSelectedDate 方法更改日期的选择 我有一个 今天选择 按钮
  • 主键删除需要多长时间?

    画一个简单的表结构 Table1 Table2 ID lt ID Name gt Table1ID Name Table1有几百万行 例如 350 万行 我通过主键发出删除 DELETE FROM Table1 WHERE ID 100 中
  • 如何判断一个app是原生的还是html5的? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想知道移动应用程序是如何原生或 html5 的 有没有什么软件或者网站可以说明这一点 如何检测应用程序是本机应用程序还是 html5 您可以使用 w
  • FirebaseIndexRecyclerAdapter onDataChanged 被调用但 getItemCount() 始终返回 0

    我在用着FirebaseIndexRecyclerAdapter https github com firebase FirebaseUI Android blob master database src main java com fir
  • 动态元素 ID 到 setId(int) - Android

    我看到了语法定义setId int and findViewByID int 但我们如何使用findViewById R id row1 我尝试使用这个 Object1 setId Integer parseInt repeat 它没有显示
  • 带 LiveData 的嵌套观察者(观察观察者)

    我有一个案例 我有 BottomNavigationView 其中片段被显示 隐藏而不是添加 替换 因此它们不会每次都经历生命周期 片段1正在观察一个数据库表 片段2正在观察一个不同的 我的目标是调用 onChanged片段2当 on 改变
  • 使用 Android Intent 发送基于 HTML 的电子邮件正文

    我需要使用 android Intent extra 将基于 HTML 的内容发送到电子邮件应用程序 它接受一些标签 例如 br 但它没有显示任何锚链接或 h1 其显示像简单的文本 EDITED I have tried with gmai
  • 应用程序在 JSON jparser 发出 http 请求时崩溃

    您好 我使用本教程连接到网络或本地的 mySQL 数据库 here http www androidhive info 2012 05 how to connect android with php mysql 虽然所有服务器端 php 文
  • 二进制 XML 文件行 #:膨胀类片段时出错:仅在 Android (6.0)-Marshmallow 上

    我无法在 Android M 上显示 google 地图 这是布局 xml
  • 应用程序被终止时无法处理 FCM 消息

    我一直在阅读各种教程 其他 SO 线程以及官方 Android 开发人员和 Firebase 文档 但无济于事 我已经尝试了几乎所有的方法 但我已经耗尽了精力和时间 因为我正在修复以前可以工作但现在不再工作的通知系统 我正在使用 Azure
  • JavaScript:字符串连接性能低下? Array.join('')?

    我读过如果我有一个for循环 我不应该使用字符串连接 因为它很慢 例如 for i 0 i lt 10000000 i str a 相反 我应该使用Array join 因为它更快 var tmp for i 0 i lt 10000000
  • 什么是样板代码、热点代码和热点?

    我知道这些术语是在性能实现 优化的背景下使用的 最近一直在研究这个问题 并尝试过搜索 但没有得到任何例子 清楚地阐述 描述这些概念以及在现实世界开发场景中实现这些问题 概念 有人可以彻底解释这些术语 示例场景以及可能使用这些概念和术语的地方
  • TextView ClickableSpan 按下状态的样式[重复]

    这个问题在这里已经有答案了 我对 ClickableSpan 进行子类化 以自定义 TextView 中链接的文本样式 private static class LinkSpan extends ClickableSpan Override
  • 蓝牙连接;无法正确发送字符串

    当我需要将字符串从服务器蓝牙套接字发送到客户端蓝牙套接字时 我的程序遇到了麻烦 只要我一次只发送一个字符串 例如聊天 一切都可以正常工作 但是如果我需要在短时间内编写更多字符串 以交换信息 则字符串将不会与客户端代码分离 例如 如果我发送
  • Android - 减少位图绘制的内存使用量

    我的应用程序中有一张地图 显示了 Gowalla 的位置 我使用带有简单默认标记的 ItemizedOverlay 但在绘制项目时 我将默认标记替换为从 Gowalla 下载 9 并缓存在磁盘上 的位置图标 问题是 如果屏幕上有很多位置 例
  • GreenDao交易

    我在用着GreenDao存储大量数据 来自休息服务 我的很多实体都与关系相关 一切都很顺利 但明天我必须实施坚如磐石的工作流程 当我加载数据时我必须检查是否发生错误 如果是这样 我必须确保没有存储任何内容在 SQLite 数据库中 通常我会

随机推荐

  • MemoryCache 的大小设置意味着什么?

    在控制器类中 我有 using Microsoft Extensions Caching Memory private IMemoryCache cache private readonly MemoryCacheEntryOptions
  • PHP 创建日期范围

    以这种格式的日期开始 2011 05 01 09 00 00 如何创建一个包含一年中所有工作日 因此排除所有周六和周日 的所有办公时间 09 00 到 17 00 的数组 我想要达到的是这样的 2011 05 01 09 00 00 201
  • 重置远程跟踪分支

    如何将远程跟踪分支的分支指针重置为其之前的提交之一 这样看起来我没有拉动 类似于本地分支的硬重置 您可以使用以下命令设置对任何其他提交的引用 git update ref refs remotes origin master
  • 如何从 VB-6 旧应用程序中启动屏幕键盘程序

    我正在尝试从 Windows 10 32 或 Windows 10 64 位计算机上的 VB 6 应用程序中 shell osk exe 过去我们只是简单地使用 Private Sub Command1 Click Dim strTemp
  • 您能否将 TeamCity“工件”配置为重新检入源代码管理?

    我希望将 TeamCity Artifacts 重新签入源代码管理 我以前使用过 TFS Integrator 所以我习惯了它的方法 通过配置 它可以将输出构建签入源代码管理 然后 当人们进行 get 操作时 他们将收到这些文物 或者是否有
  • 指定共享对象(共享库)的名称

    Go 编译器为共享对象生成的名称是错误的 例子 go install buildmode shared linkshared github com apache thrift lib go thrift code google com p
  • Windows 安装程序和安装应用程序合并到一个文件中?

    我使用 Visual Studio 在 C 中编写了一个应用程序 我创建了一个项目设置文件 该文件在我的调试中为我创建了文件 Windows Installer 和安装应用程序都是必需的 但我想将它们合并为一个 就像当您下载应用程序时 安装
  • java中删除文件中的一行

    好的 所以我尝试使用 java lang String 从文本文件中删除行 目前我这样做的方式是跟踪行号并输入索引 索引是我要删除的行 因此 每次读取新的数据行时 我都会增加行数 现在 当我达到相同索引的行数时 我不会将数据写入临时文件 现
  • asp.net mvc相当于rails回调before_save

    您好 我正在寻找一个 ASP NET MVC 回调 以便在保存模型之前获取详细数据 Rails 中有 before save Thanks 如果您正在使用实体框架 您的标签表明 那么这个 StackOverflow 帖子 https sta
  • Async CTP 可以与可移植库一起使用吗

    我想看看异步 CTP 是否带有可移植类库 不可以 异步 CTP 对于桌面 电话 Silverlight 4 和 Silverlight 5 有不同的 dll 希望在不久的将来 所有这些平台都将原生支持任务 和异步 然后可移植类库将能够使用异
  • 依赖注入和项目参考[重复]

    这个问题在这里已经有答案了 我正在尝试了解 DI 以便更好地了解 IoC 以及其他好处 在 DI 之前 我有一个项目 其中包含一个 UI 项目 MVC 一个 BusinessLogic 项目和一个 DataAccess 项目 我还有一个 S
  • 当 Django 在 postgresql 中使用可序列化事务隔离级别时,哪些具体异常代表序列化失败?

    有时 对于 Django 中的数据库操作 需要使用比默认 已提交读 更高的隔离级别 文档警告 https docs djangoproject com en 1 11 ref databases isolation level that 在
  • StringBuilder 在 C# 中的性能?

    我有一个StringBuilder对象 我在其中添加一些字符串 如下所示 我想知道哪种方法更好 第一个是 StringBuilder sb new StringBuilder sb Append Hello How are you 第二个是
  • 使用 XSLT 转换 XML 并保留 Unicode 字符

    我的 XSLT 转换已经成功了几个月 直到我遇到带有 Unicode 字符 很可能是表情符号 的 XML 文件 我需要保留 Unicode 但 XSLT 正在将其转换为 HTML 实体 我认为将编码设置为 UTF 8 可以解决我的问题 但我
  • 为什么 copyTo(... PASTE_VALUES) 在宏中间不起作用?

    我长期使用的电子表格技术之一是就地复制 粘贴特殊值 C PSV 使用公式生成我感兴趣的值后 I C PSV 然后可以删除源数据 所以我写了一个使用这种技术的宏 但单元格最终是空的 但如果我将宏分成两个 在 C PSV 之前结束第一个宏 那么
  • 不同种类的ReaderT?

    冒着成为一个XY问题 https en wikipedia org wiki XY problem 是否有可能有一个ReaderT与不同的环境 我正在尝试类似 type AppM perms ReaderT perms IO 但是编译器抱怨
  • 如何以动态方式创建 Spring Bean。使用 Quartz SchedulerFactoryBean

    我有一个QuartzJobConfig我注册的班级Spring Quartz Beans 我按照指示SchedulerFactoryBean JobDetailFactoryBean and CronTriggerFactoryBean 我
  • 绘制动画

    我正在创建一个简单的应用程序 当用户按下按钮时 屏幕上将绘制一系列线条 并且用户将能够实时看到这些线条 几乎像动画一样 我的代码看起来像这样 已简化 UIGraphicsBeginImageContext CGSizeMake 300 30
  • 如何在Java中对多通道声音输入进行采样

    我意识到这可能是相对小众的 但这也许就是为什么无论如何都要问这个问题 我正在寻找一个硬件多输入录音控制台 例如 Alesis IO 26 来接收 Adat 光管 8 通道输入来进行信号处理 由于我还没有获得该设备 并且需要弄清楚这是否可行
  • ListView 与 getView() 由于不断的 GC 而变得缓慢?

    我的应用程序中有一个 ListView 并且我已经重写了 getView 方法 因此我可以根据行的文本更改行的 ImageView src 问题是 我注意到 ListView 滚动滞后 当我检查 DDMS 时 似乎每次滚动 ListView