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

问题描述 投票:0回答:2

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

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 文件,但一切看起来都正常,并且在我的实际手机上运行良好..

android android-layout kotlin
2个回答
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">

链接:解决方案


0
投票

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

你可能不应该使用这样大小的图像(或者如果你是,你可能需要研究更有效的显示它们的方法) - 但从听起来的情况来看,你有一个东西的列表,并且图像应该相当小。所以你绝对不想使用巨大的!

实际上,您需要计算出图像在屏幕上应有多大(在

dp
中,与其他所有
View
的测量单位相同,因此很容易比较),然后将其大小调整为适当的像素大小。 这里是不同密度的描述(包括 dp 到像素的转换 - 理想情况下,您将拥有每个密度的版本,完美调整大小并优化(例如,您可能希望对较小的密度应用锐化)

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

© www.soinside.com 2019 - 2024. All rights reserved.