Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 异常:OutOfMemoryError_Android_Out Of Memory - Fatal编程技术网

Android 异常:OutOfMemoryError

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

我已在play store中发布了我的应用程序。现在在崩溃和ANR中,我在2台设备(Galaxy Note 3和Galaxy Note II)上发现以下错误。我不知道如何解决这些错误,这是什么类型的错误?因此,请帮助我修复这些错误。在其他设备上,我没有收到任何报告

错误-

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"