当前位置: 首页 > 面试题库 >

仅限Android 2.3.3设备上的Stackoverflow

宋奇希
2023-03-14
问题内容

我一直在研究可能会Native Android App遇到一些虫子的地方Android 2.3.3 versions and below Android 3.0 version

我没有到达代码的确切位置,因为在Logcat中编译了每一行代码,但最后却得到了非常奇怪的错误,在下面描述日志:

java.lang.StackOverflowError
at java.util.concurrent.locks.ReentrantLock$NonfairSync.tryAcquire(ReentrantLock.java:189)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1171)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
at java.util.concurrent.CopyOnWriteArrayList.removeRange(CopyOnWriteArrayList.java:569)
at java.util.concurrent.CopyOnWriteArrayList.remove(CopyOnWriteArrayList.java:366)
at java.util.concurrent.CopyOnWriteArrayList.remove(CopyOnWriteArrayList.java:376)
at android.view.ViewTreeObserver.removeOnPreDrawListener(ViewTreeObserver.java:377)

at android.widget.TextView.onDraw(TextView.java:4085)
at android.view.View.draw(View.java:6986)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)

    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.widget.FrameLayout.draw(FrameLayout.java:361)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)

    at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:7093)
at android.widget.FrameLayout.draw(FrameLayout.java:361)
at android.widget.ScrollView.draw(ScrollView.java:1421)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.widget.FrameLayout.draw(FrameLayout.java:361)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.d

当我检查代码时,没有发现stackoverflow的痕迹。当我在android
3.0或更高版本上运行相同的代码时,它可以有效运行并正确运行,但在android 2.3.3或3.0以下版本上却无法运行。请让我知道是否有人知道这个问题吗?

[编辑]我正在使用Tab活动,因此主布局为Main.xml,在该子活动中包含名为firstTab_Results.xml的视图,它具有一个表布局,该表布局实际上执行inflate_table_firstTab.xml布局的最多20个视图。

[编辑2]无论如何我都不会递归它,它会将最多20个视图(inflate_table_firstTab.xml)膨胀为表格布局(firstTab_Results.xml)。

Note : Stackoverflow happens on single or dual core processor devices & without fullscreen mode .

问题答案:

您的视图层次结构太深。以递归方式绘制层次结构时,堆栈空间用完了,无法深入层次结构,如堆栈跟踪中所观察到的那样。

之所以仅在较早的设备中发生这种情况,是因为UI线程堆栈大小在Android2.3设备中仅为12kB,而在较新的OS版本中为16kB。

如何减少视图层次结构深度?只需尽可能避免嵌套布局。您发布的布局太复杂了,无法在此Stack
Overflow模型中为您解决这些布局(需要花费一些时间才能正确完成,并且可能太具体以至于无法帮助其他人),但是这里有一些一般性准则:

  • 删除不必要的布局。例如,在firsttab_results.xml中,只需要TableLayoutRelativeLayoutLinearLayout顶部几乎没有用。在您的ScrollView布局中,至少有6个嵌套布局,一个或最多两个可能就足够了。

  • 布局中的一个孩子是代码气味。在大多数情况下,可以将子级移动到其父级布局并使用边距调整布局。

  • 通常几乎不需要将布局放在内RelativeLayout。相对布局在使用相对位置和子基线对齐来布置其子项方面功能强大。

  • 如果您仅需要一个嵌套布局background,请尝试将背景移至例如View嵌套布局具有相同大小的,然后在其顶部布局其他元素。

  • 请注意Android Lint警告。该工具在检测可以简化的视图层次结构复杂性方面已经变得非常出色。



 类似资料:
  • 问题内容: 我试图使我的自适应CSS样式 仅 在平板电脑和智能手机上起作用。基本上,我有一种桌面风格,一种移动风格:肖像风格和一种移动风格:风景风格。我完全不希望移动样式干扰桌面演示。我玩过无数次媒体查询,但是结果要么移动样式显示在桌面上,要么移动样式仅显示在移动设备上,但只有一组规则(无响应)。有什么办法可以将两者完全分开吗? 我现在拥有的代码如下所示: 问题答案: 您所拥有的一切应该可以正常工

  • 我的Android应用程序无法安装在一些“随机”、较旧的API设备上(任何低于API级别25的设备),错误如下: 所以,基本上看起来… API 我见过类似的问题,答案与小写的包名有关。我已经有了。 有人有什么想法吗? 舱单: BTW我用的是Visual Studio 2019和一夫一妻制3.7

  • 问题内容: 我看到Google Play中与Fabric / Crashlytics相关的崩溃。从正常的Crashlytics更新到新的Fabric Crashlytics之后,发生了这种情况。我只能在其中一台设备(Galaxy S2)上重现它。我拥有的所有其他设备(Nexus 5和S4)都没有崩溃。这是堆栈跟踪: 这是我的build.gradle的内容: 问题答案: 我只是凭直觉就知道了!升级到

  • ANR堆栈: Java代码:dEmptyOperation类扩展自AsyncTask。refreshList方法包括一个volley post请求

  • 问题内容: 我面临一个非常奇怪的问题。解析此字符串时,出现以下异常- 奇怪的是,发生此异常的设备是朋友的 Nexus 5 。但是,如果我在 Nexus 5 / 其他几个模拟器 上调试了相同的字符串,则可以正常工作。 这是我正在使用的代码。属于包。属于包 这是完整的堆栈跟踪。 问题答案: 设备默认语言环境中的am / pm符号可能会影响它,因此请尝试使用以下语言环境来解析日期,这将对您有所帮助。

  • 以下代码包括从服务器下载文件并将其保存在存储中,当设备有内部存储时,该代码可以正常工作。 但当我尝试使用没有内部存储的设备时,只使用外部存储时,我得到以下异常。 有什么建议吗?原因是什么?顺便提一下,Environment.getExternalStorageDirectory()返回/mnt/sdcard/,file.mkdir()返回false。