Android - 看似无害的布局会导致应用在短暂使用后崩溃而没有任何错误

Posted

技术标签:

【中文标题】Android - 看似无害的布局会导致应用在短暂使用后崩溃而没有任何错误【英文标题】:Android - Seemingly harmless layout causes app to crash after short use without any errors 【发布时间】:2017-01-27 21:06:22 【问题描述】:

经过 2 天毫无结果的测试,我决定在这里发布我的问题,希望我遗漏了一些明显的东西。

我将看似无害的 xml 布局归结为图像、布局和滚动视图的随机集合。这里是:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="@drawable/wood_texture"
    tools:context="com.testlayout.example.testlayout.MainActivity">

    <ImageView
        android:layout_
        android:layout_
        android:src="@drawable/image_one"
        android:id="@+id/imageOne"
        android:adjustViewBounds="true"
        android:layout_gravity="center_vertical"
        android:visibility="visible"/>

    <ImageView
        android:layout_
        android:layout_
        android:background="@drawable/dark_wood_texture"
        android:id="@+id/darkWood"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="20dp"
        android:visibility="visible"/>

    <HorizontalScrollView
        android:layout_
        android:layout_
        android:id="@+id/handScrollView"
        android:scrollbars="none"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="20dp"
        android:visibility="visible">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_
            android:layout_
            android:id="@+id/handLayout">

            <ImageView
                android:layout_
                android:layout_
                android:src="@drawable/image_three"
                android:id="@+id/imageView"
                android:adjustViewBounds="true"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"/>

            <ImageView
                android:layout_
                android:layout_
                android:src="@drawable/image_three"
                android:id="@+id/imageView2"
                android:adjustViewBounds="true"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"/>

            <ImageView
                android:layout_
                android:layout_
                android:src="@drawable/image_three"
                android:id="@+id/imageView6"
                android:adjustViewBounds="true"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"/>

        </LinearLayout>

    </HorizontalScrollView>

    <ImageView
        android:id="@+id/imageTwo"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/image_two_tiled"
        android:scaleType="fitXY"/>
</RelativeLayout>

我可以很好地将这个布局加载到我的手机上,但是在滚动视图中滑动短短 5 秒后,应用程序会突然崩溃到主屏幕 - 没有报告应用程序已停止工作。我一直在三星 Galaxy s6 上进行测试。 我还在三星 Galaxy Tab 2 上测试过这个问题,没有发生(我的真实应用和这个测试应用都可以在平板电脑上正常运行)。

I've created a new Android Studio project;如上所述,我所做的唯一更改是对res/layout/activity_main.xml。我还包括了我正在使用的drawables。我希望有比我更好的调试技能的人可以拉下那个项目,或者简单地使用上面的布局创建一个他们自己的新项目(这就是它的全部内容,尽管无论如何你都需要我的可绘制对象)。

我想澄清一下,我不是在寻找解决此问题的方法,我是在尝试了解这个问题。问题是,经过 2 天的测试,我找到了六种看似“解决”问题的方法。但它们都没有任何意义,而且它们似乎都无关。如果我不知道为什么我的解决方案解决了这个问题,我将不知道在未来的开发过程中如何避免它

观察

正如我上面提到的,我找到了几种“修复”问题的方法(即让它不再崩溃),但它们似乎都不相关。以下是一些:

将几乎所有元素的visibility 设置为gone。 从根元素中删除background。 从drawable/image_two_tiled.xml 中删除android:tileMode="repeat" 行 请注意,将tileMode 更改为其他内容(例如clamp)并不能解决问题。 仅删除它(或将其设置为 disabled)。 将 ID 为“@+id/imageTwo”的 ImageView 的src 设置为image_two_smaller_tiled。 这与image_two_tiled 完全相同,只是分辨率更小。

这绝不是一个详尽的列表,但它让您了解这些修复是多么不连贯(尤其是 tileMode 修复)。

据我所知,它看起来像是某种内存问题。我对android开发还很陌生,所以我不太熟悉我需要使用的内存限制,但是如果我导致堆爆炸的图像很少,而且尺寸相当小,我会非常担心(至少,肯定不大)。

如果有人能准确地告诉我是什么导致我的应用程序崩溃,我会的。 . .好吧,我将非常感激。因为在尝试自己调试 2 天后,我准备退出 android 开发:(

编辑

应用程序本身不会引发异常,但是当我不单独过滤来自我的应用程序的日志消息时,logcat 确实会在崩溃时始终显示此错误。

E/Resources: RunTimeException
android.content.res.Resources$NotFoundException: Resource ID #0x7f0202cf
    at android.content.res.Resources.getValue(Resources.java:2558)
    at android.content.res.Resources.startRC(Resources.java:1116)
    at android.app.ActivityThread$mRunnable.run(ActivityThread.java:3056)
    at java.lang.Thread.run(Thread.java:818)

e2:我开始怀疑这是否是我的手机问题,而不是应用程序的问题,因为我可以在平板电脑上正常运行它。如果他们尝试在 Galaxy s6 上运行它,我真的很想知道是否有其他人遇到这个问题。 特别是 S6 - 这会告诉我这是 我的 手机还是所有 S6 的问题。

【问题讨论】:

崩溃后显示的异常是什么? @Joshua 已编辑以包括可能的罪魁祸首。应用本身不会抛出任何异常。 您解决异常了吗?它说您可以使用不存在的资源 id。 这是“神秘细菌”问题之一,您可以解决它,但不知道会发生什么.. 我遇到过很多次.. 好吧,我们应该从哪里开始解决问题或它的 rootb? @Joshua 我的应用程序中不存在资源 ID。但我也没有在任何地方引用它——这个异常是从我的应用程序外部抛出的。 【参考方案1】:

This previous SO post answer solved my issue.

简而言之,是 BitmapDrawable 导致了整个问题。虽然很遗憾我不能说为什么这可以解决问题,但设置使用layerType="software" 位图的视图将防止崩溃。

在布局中:android:layerType="software" 在代码中:view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

【讨论】:

以上是关于Android - 看似无害的布局会导致应用在短暂使用后崩溃而没有任何错误的主要内容,如果未能解决你的问题,请参考以下文章

Android项目启动时短暂的黑屏白屏处理

通过移动设备在 Android Studio 中单击 TextView 会导致应用程序崩溃 [关闭]

Android:更改视图顺序会导致“不幸的是,应用程序已停止”OK。为啥?

在 Android 布局 XML 中的 EditText 元素之前放置一个 TextView 会导致 EditText 不显示

为什么一段看似正确的代码会导致DUBBO线程池被打满

如何处理分布式系统中的紧急情况?