首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >加载位图时出现内存不足错误

加载位图时出现内存不足错误
EN

Stack Overflow用户
提问于 2013-01-16 20:56:51
回答 3查看 22.3K关注 0票数 17

我有一个android应用程序,有3个acitivtys:

A1 --开始--> A2 --开始--> A3 --完成他的进程时:开始--> A1

(所以我不会"finish();“一个应用程序。我在用户交互之后一直使用"startActivity(..);“开始下一个活动。)

所以在这3个练习中有一个循环。在每次活动中,我都会显示3-9张图片,这些图片位于SD卡上,我用以下功能加载了这些图片:

代码语言:javascript
复制
try
{
    Uri selectedImageURI = Uri.parse(strImagePath);
    File imgFile = new  File(getRealPathFromURI(selectedImageURI, c));
    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
    ivTmp.setImageBitmap(myBitmap);
}catch (Exception e)
{
    return null;
}

这一切都行得通。但有时(在我的activitys中循环几次之后),我的应用程序会崩溃。

Logcat告诉我:

代码语言:javascript
复制
01-16 13:42:15.863: DEBUG/dalvikvm(23161): GC_BEFORE_OOM freed 10K, 9% free 59019K/64400K, paused 29ms, total 30ms
01-16 13:42:15.863: ERROR/dalvikvm-heap(23161): Out of memory on a 8018704-byte allocation.
01-16 13:42:15.863: ERROR/AndroidRuntime(23161): FATAL EXCEPTION: main
        java.lang.OutOfMemoryError
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
        at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
        at android.content.res.Resources.loadDrawable(Resources.java:1965)
        at android.content.res.Resources.getDrawable(Resources.java:660)
        at android.widget.ImageView.resolveUri(ImageView.java:616)
        at android.widget.ImageView.setImageResource(ImageView.java:349)
        at <MyApp>.MyActivity$6.run(MyActivity.java:143)
        at android.os.Handler.handleCallback(Handler.java:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5039)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)

有没有人可以给我一些提示,如何处理崩溃?也许是因为我的activitys设置为“已暂停”状态,而不是正确关闭它们?

EN

回答 3

Stack Overflow用户

发布于 2016-03-02 01:33:25

我在显示高分辨率图像时遇到了类似的问题。我已经搜索并应用了http://developer.android.com/training/displaying-bitmaps/index.html中给出的所有安卓位图解决方案,并在链接中使用了以下缓存机制。但它们都不起作用。任何地方都没有任何正确的解决方案。然后我意识到问题是:我不能正确使用可绘制文件夹结构。我将高分辨率图像保存在mdpi和hdpi文件夹中。这导致android将图像放大到超大尺寸。由于android显示器/内存部分,100kb图像导致内存增加了20mb。所以我把这些超分辨率图像添加到xxhdpi文件夹中,然后它突然被修复了。然后我的图像滑块就可以完美地工作了

票数 2
EN

Stack Overflow用户

发布于 2013-01-16 21:07:55

是的,当活动对用户不可见时,android不会立即销毁它们,但有许多生命周期方法可以根据当前状态调用。查看http://developer.android.com/guide/components/activities.html#Lifecycle

您可以尝试在onStop()或onDestroy()中完成活动,因为当活动不可见和系统内存不足时将分别调用这两个函数。:-)

票数 0
EN

Stack Overflow用户

发布于 2013-01-16 21:29:55

这是由于图像的高分辨率,您必须使用以下代码缩放位图

代码语言:javascript
复制
 Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

    int h = 100; // height in pixels
    int w = 100; // width in pixels
Bitmap photoBitMap = Bitmap.createScaledBitmap(myBitmap,h, w, true);
ivTmp.setImageBitmap(photoBitMap);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14359024

复制
相关文章

相似问题

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