Android 位图处理时内存泄漏

Android 位图处理时内存泄漏,android,bitmap,out-of-memory,Android,Bitmap,Out Of Memory,我试着编写一些相机意图处理程序,用于拍照和后期处理(如果需要的话)。如果我在高分辨率上拍摄一些照片,我的程序会被“分配太大”打断。如果我以较低的分辨率拍摄一些照片,我可以拍摄更多的照片,但它也会破裂。经过一番搜索,我发现我必须回收我手工制作的位图。但问题并没有解决。我的主要问题是,我不知道是否有1。我的代码2内存泄漏。我不知道它为什么要分配内存,因为我没有在程序中显示位图(现在),我只是保存它们以供进一步重用 public void onClick(View view) { Intent

我试着编写一些相机意图处理程序,用于拍照和后期处理(如果需要的话)。如果我在高分辨率上拍摄一些照片,我的程序会被“分配太大”打断。如果我以较低的分辨率拍摄一些照片,我可以拍摄更多的照片,但它也会破裂。经过一番搜索,我发现我必须回收我手工制作的位图。但问题并没有解决。我的主要问题是,我不知道是否有1。我的代码2内存泄漏。我不知道它为什么要分配内存,因为我没有在程序中显示位图(现在),我只是保存它们以供进一步重用

public void onClick(View view) {
    Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
    this.mLastPic = new File(this.mFs.getDirPath(), this.mFs.getNextPicName()); //create and save a file for pic
    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mLastPic));
    this.startActivityForResult(i, 0);
}
活动结果处理程序上的

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == Activity.RESULT_OK && requestCode == 0) {

        try {
            if(!this.mController.getSetting(R.string.USE_HEIGH_RESOLUTION)) { //use high res or not
                int quality = this.mFs.getPicQuality(); //get compress quality
                Bitmap pic = BitmapFactory.decodeFile(this.mLastPic.getPath());
                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                pic.compress(Bitmap.CompressFormat.JPEG, quality, outStream);
                String path = this.mLastPic.getPath();
                if(this.mLastPic.delete()) { //replace the old file with a now file
                    File newFile = new File(path);
                    newFile.createNewFile();
                    FileOutputStream os = new FileOutputStream(newFile);
                    os.write(outStream.toByteArray());
                    Log.d("newEntryActivity.onActivityResult", "replaced pic ");
                } else {
                    Log.d("newEntryActivity.onActivityResult", "cant delete old pic");
                }
                pic.recycle(); //cleaning up
                outStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
日志显示

05-09 14:35:01.694:E/dalvikvm堆(845):6380496字节外部分配对此进程太大。05-09 14:35:01.694:E/(845):VM不允许我们分配6380496字节

05-09 14:35:01.694:D/AndroidRuntime(845):关闭虚拟机

05-09 14:35:01.694:W/dalvikvm(845):threadid=3:线程以未捕获异常退出(组=0x4001b188)

05-09 14:35:01.694:E/AndroidRuntime(845):未捕获处理程序:由于未捕获异常而退出主线程

05-09 14:35:01.714:E/AndroidRuntime(845):java.lang.RuntimeException:无法启动活动组件信息{unicorn.Heurazio/unicorn.Heurazio.SettingsActivity}:android.view.InflateException:二进制XML文件行#2:膨胀类时出错

05-09 14:35:01.714:E/AndroidRuntime(845):由以下原因引起:android.view.InflateException:二进制XML文件行#2:膨胀类时出错

05-09 14:35:01.714:E/AndroidRuntime(845):在android.view.LayoutInflater.createView(LayoutInflater.java:513)

05-09 14:35:01.714:E/AndroidRuntime(845):在com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.view.LayoutInflater.充气(LayoutInflater.java:385)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.view.LayoutInflater.inflate(LayoutInflater.java:320)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.view.LayoutInflater.inflate(LayoutInflater.java:276)

05-09 14:35:01.714:E/AndroidRuntime(845):位于com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)

05-09 14:35:01.714:E/AndroidRuntime(845):位于android.app.Activity.setContentView(Activity.java:1622)

05-09 14:35:01.714:E/AndroidRuntime(845):在unicorn.Heurazio.SettingsActivity.onCreate(SettingsActivity.java:38)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)上

05-09 14:35:01.714:E/AndroidRuntime(845):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)

05-09 14:35:01.714:E/AndroidRuntime(845):。。。还有11个

05-09 14:35:01.714:E/AndroidRuntime(845):由以下原因引起:java.lang.reflect.InvocationTargetException

05-09 14:35:01.714:E/AndroidRuntime(845):在android.widget.LinearLayout.(LinearLayout.java:92)

05-09 14:35:01.714:E/AndroidRuntime(845):位于java.lang.reflect.Constructor.constructNative(本机方法)

05-09 14:35:01.714:E/AndroidRuntime(845):位于java.lang.reflect.Constructor.newInstance(Constructor.java:446)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.view.LayoutInflater.createView(LayoutInflater.java:500)

05-09 14:35:01.714:E/AndroidRuntime(845):。。。还有21个

05-09 14:35:01.714:E/AndroidRuntime(845):原因:java.lang.OutOfMemory错误:位图大小超出VM预算

05-09 14:35:01.714:E/AndroidRuntime(845):在android.graphics.Bitmap.nativeCreate(本机方法)>05-09 14:35:01.714:E/AndroidRuntime(845):在android.graphics.Bitmap.createBitmap(Bitmap.java:468)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.graphics.Bitmap.createBitmap(Bitmap.java:435)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)上

05-09 14:35:01.714:E/AndroidRuntime(845):在android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)上

05-09 14:35:01.714:E/AndroidRuntime(845):在android.graphics.drawable.drawable.createFromResourceStream(drawable.java:697)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.content.res.Resources.loadDrawable(Resources.java:1705)上

05-09 14:35:01.714:E/AndroidRuntime(845):在android.content.res.TypedArray.getDrawable(TypedArray.java:548)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.view.view.(view.java:1850)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.view.view.(view.java:1799)

05-09 14:35:01.714:E/AndroidRuntime(845):在android.view.ViewGroup。(ViewGroup.java:284)

任何帮助都会很好


请尝试在应用程序中添加清单。如果检查日志,它看起来像一个大的(~6MB)位图分配是在
unicorn.Heurazio.SettingsActivity
中膨胀视图时发生的。查看您的资源,查看您是否在某处使用大位图作为背景。

如果您检查日志,则在
unicorn.Heurazio.SettingsActiv中膨胀视图时,似乎发生了大(~6MB)位图分配
Bitmap tmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.logo);
Log.d("mainApp", tmp.getRowBytes() * tmp.getHeight() / 1024 + "kB");