【问题标题】:Memory leak in dynamically creating linearlayout and textviews动态创建线性布局和文本视图中的内存泄漏
【发布时间】:2023-04-11 08:00:01
【问题描述】:

我在创建大量 LinearLayoutTextView 时遇到问题 基本上我的应用程序显示文本,我在相应的行中动态创建行(LinearLayout)和单词(TexView)。现在我的应用程序也使用FragmentStatePagerAdapter,所以我可以“更改页面”。对于那件事我没有任何疑问。问题是当我使用新的 textsize 重定向到我自己的活动时,它在添加行时会以某种方式泄漏。

 int threshold = 25;
 int tw = 0;
 LinearLayout ll = rootView.findViewById(R.id.container);
 LinearLayout row = new LinearLayout(a);
  for(int x = 0;x<words.size();x++)
 {
   tw+=words.get(x).length;
   TextView tv = new TextView(a);
   tv.setText(words.get(x));
   if(tw > threshold)
   {
        ll.addView(row)  <----- this is where out of memory points me
        row = new LinearLayout(a);
        tw = 0;
        x-=1;
   }
   else
        row.addView(tv);

}

现在我也尝试转储堆并使用 mat 进行分析,但是我创建的转储有一个无效的标头错误,所以除了我在 logcat 中指向的实际错误日志之外,我不知道实际泄漏来自哪里ll 添加我不知道是否适合查看的行。

已编辑:添加了一些信息。当我通过线性布局参数调整行高时,似乎会出现问题,因为当我设置自己的默认值 50 时,通常就可以了。有人知道这是什么原因吗?

【问题讨论】:

  • 可能有死循环。
  • 死循环是什么意思?你的意思是因为x-=1?但我将 tw 初始化为 0,所以下一次迭代应该继续。
  • 为什么单词都有size方法和length属性?

标签: android eclipse memory


【解决方案1】:

在某些情况下,您的循环可能会进入死循环。

例如,如果您的 words 列表包含长度超过 threshold(25) 的 String,则 if 语句 (tw &gt; threshold) 将永远评估为 true,并且因为您还减去循环计数 @ 987654325@减一,这就是死循环发生的地方。

【讨论】:

  • 是的,但在我的情况下,我主要是在将文本添加到单词数组列表之前通过连接一个 - 并将文本分成两个长度大于 15 的文本。所以我明白了涵盖的东西我只是没有包括它,因为如果我添加所有代码会很长。感谢回复
猜你喜欢
  • 2012-08-23
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多