应用程序在设备上运行但在模拟器上崩溃

时间:2021-01-11 07:06:01

标签: android android-layout kotlin

我有一个在我的手机设备上运行时可以完美运行的应用程序。但是,在模拟器上运行时会崩溃。


  2021-01-11 06:58:24.719 19783-19783/com.example.myapplication E/RecyclerView: No adapter attached; skipping layout
2021-01-11 06:58:35.827 19783-19783/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 19783
    java.lang.OutOfMemoryError: Failed to allocate a 599752036 byte allocation with 4194304 free bytes and 199MB until OOM
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:620)
        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:455)
        at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1155)
        at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:720)
        at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571)
        at android.content.res.Resources.loadDrawable(Resources.java:858)
        at android.content.res.TypedArray.getDrawable(TypedArray.java:928)
        at android.widget.ImageView.<init>(ImageView.java:162)
        at android.widget.ImageView.<init>(ImageView.java:150)
        at androidx.appcompat.widget.AppCompatImageView.<init>(AppCompatImageView.java:74)
        at androidx.appcompat.widget.AppCompatImageView.<init>(AppCompatImageView.java:69)
        at androidx.appcompat.app.AppCompatViewInflater.createImageView(AppCompatViewInflater.java:199)
        at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:119)
        at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1551)
        at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1602)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:769)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
  at com.example.myapplication.Fragments.Friends_List$DisplayAllFriends$adapter$1.onCreateViewHolder(Friends_List.kt:495)

问题是指向我的好友列表 xml 文件,但在我的实际手机上看起来一切正常并且运行良好..

2 个答案:

答案 0 :(得分:1)

编辑清单android:hardwareAccelerated="false" , android:largeHeap="true"

<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">

链接:Solution

答案 1 :(得分:0)

在评论中回答,但问题是它试图为 599MB 位图分配内存,这是非常大的!它可能是一个非常大的图像 - 4000 x 4000 x 32 位 让您进入球场。它的文件大小可能没有那么大(JPG 和 PNG 可能非常有效),但它们可以解压缩为位图,并且内存使用量取决于图像的尺寸。

您可能无论如何都不应该使用这种尺寸的图像(或者,如果您是,您可能需要寻找更有效的方式来显示它们)-但从听起来像是这样,您有一个内容列表,并且图像应该相当小。所以你绝对不想使用巨大的!

实际上,您需要确定图像在屏幕上的大小(以 dp 为单位,与其他所有 View 的测量单位相同,因此很容易进行比较),然后调整它们的大小到适当的大小(以像素为单位)。 Here's a description of the different densities (with dp to pixel conversions - 理想情况下,每个密度都有一个版本,完美调整大小并优化(例如,您可能希望对较小的密度应用锐化)

这不仅仅是为了优化显示图像 - 不断缩放大图像会使您的应用运行更糟,并且包含比您实际需要的资源大得多的资源会膨胀 APK/App Bundle 的大小。因此,拥有正是您所需要的图像绝对是一个好习惯!