Android 异常:OutOfMemoryError
我已在play store中发布了我的应用程序。现在在崩溃和ANR中,我在2台设备(Galaxy Note 3和Galaxy Note II)上发现以下错误。我不知道如何解决这些错误,这是什么类型的错误?因此,请帮助我修复这些错误。在其他设备上,我没有收到任何报告 错误-Android 异常:OutOfMemoryError,android,out-of-memory,Android,Out Of Memory,我已在play store中发布了我的应用程序。现在在崩溃和ANR中,我在2台设备(Galaxy Note 3和Galaxy Note II)上发现以下错误。我不知道如何解决这些错误,这是什么类型的错误?因此,请帮助我修复这些错误。在其他设备上,我没有收到任何报告 错误- java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:677)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:507)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:872)
at android.content.res.Resources.loadDrawable(Resources.java:3022)
at android.content.res.Resources.getDrawable(Resources.java:1586)
at android.view.View.setBackgroundResource(View.java:16120)
at com.info.laughingbuddha.Buddha4.onCreateView(Buddha4.java:21)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
at android.view.Choreographer.doCallbacks(Choreographer.java:603)
at android.view.Choreographer.doFrame(Choreographer.java:572)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1259)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
at dalvik.system.NativeStart.main(Native Method)
Buddha4.java-
package com.info.laughingbuddha;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
public class Buddha4 extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.buddha, container, false);
TextViewEx t = (TextViewEx) rootView.findViewById(R.id.textView2);
t.setText("The Standing Happy Buddha brings riches and happiness.",true);
t.setMovementMethod(new ScrollingMovementMethod());
ImageView iv = (ImageView) rootView.findViewById(R.id.image1);
iv.setBackgroundResource(R.drawable.buddha4);
return rootView;
}
}
我不知道我需要发布什么代码,所以如果有人需要任何与此相关的代码,请发表评论。谢谢。尝试使用以下代码行创建缩放位图:
Bitmap scaledBitmap = Bitmap.createScaledBitmap(myBitmap, width,
height, true);
查看以下链接:
尝试使用以下代码行创建缩放位图:
Bitmap scaledBitmap = Bitmap.createScaledBitmap(myBitmap, width,
height, true);
查看以下链接:
如果您有高分辨率图像,您应该缩小它们的比例,以避免不同的设备加载图像而不会遇到内存问题。 在您的情况下,有些手机在第一次运行时可能不会表现出相同的行为,但最终,如果不处理优化的图像加载解决方案,应用程序将崩溃 进一步检查“内存问题”: 将缩小的版本加载到内存中的主题。
关于如何避免它们:
有关概述:
在将可绘制图形设置为imageview的背景之前,即:
iv.setBackgroundResource(R.drawable.buddha4);
正如@rup35h在回答中所建议的,获取一个缩放位图或尝试其他选项,如
inSampleSize
,务必检查您的解决方案对图像质量的影响。如果您有高分辨率图像,您应该缩小它们,以避免不同的设备加载图像而不会遇到内存问题。
在您的情况下,有些手机在第一次运行时可能不会表现出相同的行为,但最终,如果不处理优化的图像加载解决方案,应用程序将崩溃
进一步检查“内存问题”:
将缩小的版本加载到内存中的主题。关于如何避免它们:
有关概述:
在将可绘制图形设置为imageview的背景之前,即:
iv.setBackgroundResource(R.drawable.buddha4);
正如@rup35h在回答中所建议的,获取一个缩放位图或尝试其他选项,如
inSampleSize
,务必检查您的解决方案对图像质量的影响。有时,当我们在应用程序中使用如此多的图像和背景时,会占用android RAM上的大量空间。
这导致通过“内存不足绑定异常”强制关闭应用程序
从崩溃日志中可以看出,您的drawable相当大,因此为了避免OutOfMemory
,您保留了不会占用太多内存的drawable。你可以按照一些人在回答中的建议缩小可拉伸的尺寸
如果您不想这样做,并且没有太多大的可绘制大小,那么您可以选择将应用程序堆大小增加到较大的大小,这将增加堆内存
如何增加堆大小
您可以在android清单(此处引用)的应用程序标记中使用android:largeHeap=“true”
来请求更大的堆大小,但这在任何预处理上都不起作用
蜂窝设备
在2.3版本之前的设备上,您可以使用VMRuntime类,但这在姜饼和以上版本上不起作用。请参见下面的操作方法
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);
在设置HeapSize之前,请确保输入的大小合适,不会影响其他应用程序或操作系统功能
在设置之前,只需检查应用程序的大小,然后设置大小以完成您的工作。不要使用太多内存,否则其他应用程序可能会影响
使现代化
注意:最好的做法是在不再需要位图时释放位图的分配内存,您可以使用此
位图.recycle()
有时,当我们在应用程序中使用如此多的图像和背景时,会占用安卓RAM上的大量空间。
这导致通过“内存不足绑定异常”强制关闭应用程序
从崩溃日志中可以看出,您的drawable相当大,因此为了避免OutOfMemory
,您保留了不会占用太多内存的drawable。你可以按照一些人在回答中的建议缩小可拉伸的尺寸
如果您不想这样做,并且没有太多大的可绘制大小,那么您可以选择将应用程序堆大小增加到较大的大小,这将增加堆内存
如何增加堆大小
您可以在android清单(此处引用)的应用程序标记中使用android:largeHeap=“true”
来请求更大的堆大小,但这在任何预处理上都不起作用
蜂窝设备
在2.3版本之前的设备上,您可以使用VMRuntime类,但这在姜饼和以上版本上不起作用。请参见下面的操作方法
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);
在设置HeapSize之前,请确保输入的大小合适,不会影响其他应用程序或操作系统功能
在设置之前,只需检查应用程序的大小,然后设置大小以完成您的工作。不要使用太多内存,否则其他应用程序可能会影响
使现代化
注意:最好的做法是在不再需要位图时释放位图的分配内存,您可以使用此
位图.recycle()
加载图像资源时,必须缩小图像资源的比例
如果正在使用位图
变量加载图像,则可以使用选项。不要使用位图。createScaledBitmap
,因为它将在原始位图之外创建另一个位图
请尝试以下代码加载位图:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; //This will just get the size of your image
BitmapFactory.decodeFile(pictureFile.getAbsolutePath(), options);
//Get the downscale ratio
options.inJustDecodeBounds = false;
options.inSampleSize = calculateInSampleSize(options, widthOfTheImageView, heightOfTheImageView);
//Decode the bitmap using the downsampled image
Bitmap finalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image_name options);
//Finally, set the bitmap
imageView.setImageBitmap(finalBitmap);
其中图像视图的宽度
和图像视图的高度
表示图像视图的大小
calculateInSampleSize
方法(我从Android开发者那里得到):
加载图像资源时,必须缩小图像资源的比例 如果正在使用
位图
变量加载图像,则可以使用选项。不要使用Bitmap.creat
android:largeHeap="true"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:scaleType="centerInside"
android:scaleType="fitXY"