我有一个应用程序在我的手机设备上运行时可以完美运行。但是,在模拟器上运行时会崩溃。
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: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">
链接:解决方案
在评论中回答了,但问题是它正在尝试为 599MB 位图分配内存,这是非常巨大的!这可能是一个非常大的图像 - 4000 x 4000 x 32 位 可以让你大致了解。它的文件大小可能不是那么大(JPG 和 PNG 可能非常有效),但它们解压成位图,并且内存使用取决于图像的尺寸。
你可能不应该使用这样大小的图像(或者如果你是,你可能需要研究更有效的显示它们的方法) - 但从听起来的情况来看,你有一个东西的列表,并且图像应该相当小。所以你绝对不想使用巨大的!
实际上,您需要计算出图像在屏幕上应有多大(在
dp
中,与其他所有 View
的测量单位相同,因此很容易比较),然后将其大小调整为适当的像素大小。 这里是不同密度的描述(包括 dp 到像素的转换 - 理想情况下,您将拥有每个密度的版本,完美调整大小并优化(例如,您可能希望对较小的密度应用锐化)
这不仅仅是优化图像显示 - 不断缩放大图像将使您的应用程序运行更差,并且包含比您实际需要的大得多的资源将使 APK / App Bundle 大小膨胀。因此,拥有正是您需要的图像绝对是一个好习惯!