首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android内存不足异常

Android内存不足异常
EN

Stack Overflow用户
提问于 2013-10-10 17:15:26
回答 2查看 929关注 0票数 0

我有199KB的图像存储在内存中。我的设备的总内存是512MB。Android版本是2.3.5。所以我所做的就是让所有的图像在运行时都是位图可绘制的。

我得到了以下异常:

代码语言:javascript
复制
10-10 14:16:03.782: E/dalvikvm-heap(20331): 73632-byte external allocation too large for this process.
10-10 14:16:03.782: E/dalvikvm(20331): Out of memory: Heap Size=6599KB, Allocated=3949KB, Bitmap Size=13871KB, Limit=20480KB
10-10 14:16:03.782: E/dalvikvm(20331): Trim info: Footprint=6599KB, Allowed Footprint=6599KB, Trimmed=264KB
10-10 14:16:03.792: E/GraphicsJNI(20331): VM won't let us allocate 73632 bytes

以下是我的代码:

代码语言:javascript
复制
File myDir =act.getApplicationContext().getDir(CURRENT_THEME, act.MODE_PRIVATE);
public BitmapDrawable getResourceFromInternalStorage(String resourceName)
 {
  // Runtime.getRuntime().gc();
    String filename = resourceName;
         File file = new File(myDir, filename+".png");
   Resources res = act.getResources();
   BitmapDrawable bd =null;
   bitmap=null;
   try
   {
//    BitmapFactory.Options options = new BitmapFactory.Options();
//    options.inJustDecodeBounds = true;
//    options.inSampleSize = 32;


              BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
                   bmpFactoryOptions.inJustDecodeBounds=true;
                   BitmapFactory.decodeFile(file.getPath(),bmpFactoryOptions);

                   long reqsize=bmpFactoryOptions.outWidth*bmpFactoryOptions.outHeight*2;
                   long allocNativeHeap = Debug.getNativeHeapAllocatedSize();


                   final long heapPad=(long) Math.max(4*1024*1024,Runtime.getRuntime().maxMemory()*0.1);
                   if ((reqsize + allocNativeHeap + heapPad) >= Runtime.getRuntime().maxMemory())
                   {
                    Toast.makeText(act, "exception", Toast.LENGTH_LONG).show();
//                      bitmap.recycle();
                  //  Runtime.getRuntime().gc();
//                    System.gc();
                    //  return null;

                   }
                   bmpFactoryOptions.inJustDecodeBounds=false;
                   bitmap=BitmapFactory.decodeFile(file.getPath(),bmpFactoryOptions);
          bd = new BitmapDrawable(res, bitmap);
   }
   catch(java.lang.OutOfMemoryError e)
   {
    Log.v("Exceptional exception", e.getMessage());
    bitmap.recycle();
    System.gc();
   }
   finally{

   }

         return bd;
 }
EN

回答 2

Stack Overflow用户

发布于 2013-10-10 17:25:15

在您的位图上执行回收。你正在做这件事,但是在catch块中。

在try块中:

代码语言:javascript
复制
bitmap.recycle();
bitmap=null;

尝试上面的代码并检查。

票数 1
EN

Stack Overflow用户

发布于 2013-10-10 18:26:19

请参阅android开发人员网站上的本教程

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

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

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

https://stackoverflow.com/questions/19291687

复制
相关文章

相似问题

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