我有一个在我的手机设备上运行时可以完美运行的应用程序。但是,在模拟器上运行时会崩溃。
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 文件,但在我的实际手机上看起来一切正常并且运行良好..
答案 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 的大小。因此,拥有正是您所需要的图像绝对是一个好习惯!