首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >例外: OutOfMemoryError

例外: OutOfMemoryError
EN

Stack Overflow用户
提问于 2014-02-15 17:20:25
回答 7查看 2.8K关注 0票数 1

我已经在play商店发布了我的应用程序。现在在Crashes和and中,我在两个设备(Galaxy Note3和Galaxy Note II)上得到了以下错误。我不知道如何解决这些错误,这是什么类型的错误?因此,请帮助我修复这些错误。在其他设备上,我在那里没有得到任何报告。

错误-

代码语言:javascript
复制
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-

代码语言:javascript
复制
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;
    }
}

我不知道我需要发布什么代码,所以如果有人需要任何与此相关的代码,请评论。谢谢。

EN

回答 7

Stack Overflow用户

发布于 2014-02-15 17:28:21

尝试使用以下代码行创建按比例缩放的位图:

代码语言:javascript
复制
Bitmap scaledBitmap = Bitmap.createScaledBitmap(myBitmap, width,
                height, true);

检查以下链接:

android - out of memory exception when creating bitmap

Android out of memory exception with bitmaps

Can I catch out of memory exception in Android in Bitmap allocation for decoding a picture file?

票数 6
EN

Stack Overflow用户

发布于 2014-02-22 14:39:56

如果你有高分辨率的图像,你应该缩小它们,以避免不同的设备加载图像,而不会面临内存问题。在你的例子中,一些手机在第一次运行时可能不会表现出相同的行为,但最终,如果没有处理优化的图像加载解决方案,应用程序将崩溃。

查看更多关于“内存问题”的信息:

将缩容版本加载到内存下的主题。

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Out of memory error on Android

关于如何避免它们:

How to avoid an out of memory error while using bitmaps in Android

有关概述,请参阅:

http://blogs.innovationm.com/android-out-of-memory-error-causes-solution-and-best-practices/ http://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html

在将可绘制项目设置为图像视图的背景之前,例如:

代码语言:javascript
复制
iv.setBackgroundResource(R.drawable.buddha4);  

正如@rup35h在答案中建议的那样,获取缩放的位图或尝试其他选项,如inSampleSize,请务必检查您的解决方案如何影响您的图像质量。

票数 2
EN

Stack Overflow用户

发布于 2014-02-22 16:38:19

有时,当我们在应用程序中使用如此多的图像和背景时,它会占用android RAM上的大量空间。这会导致通过“超出内存限制异常”来强制关闭应用程序。

从你的崩溃日志看,你有一个很大的可压缩文件,所以为了避免OutOfMemory,你保留了不会占用太多内存的可压缩文件。你也可以像一些人在答案中建议的那样缩小绘图范围。

如果您不想经历这种情况,并且您没有太多可绘制的大小,那么您可以选择将您的应用程序堆大小增加到较大,这将增加堆内存。

如何增加堆大小

你可以在安卓清单的应用程序标签中使用android:largeHeap="true"来请求更大的堆大小,但这在任何蜂巢之前的设备上都不起作用。

在2.3之前的设备上,你可以使用VMRuntime类,但这在姜饼和更高版本上不起作用,请参阅下面的操作方法。

代码语言:javascript
复制
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

在设置HeapSize之前,请确保输入了不会影响其他应用程序或操作系统功能的适当大小。

在设置之前,只需检查您的应用程序的大小,然后设置大小以完成您的工作。不要使用太多内存,否则其他应用程序可能会受到影响。

更新

注意:当不再需要位图时,释放分配的位图内存始终是最佳实践,您可以使用此bitmap.recycle()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21795645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档