2012-06-26 49 views
0

当我启动应用程序时,我的堆大小增加到第一个活动的10MB,然后当我去下一个活动时,我的堆大小增加到37 MB。在第二个活动中,我按下按钮单击bitmap.recycle()释放一些内存,所以当单击特定按钮时,堆大小减小到32MB。现在,当我完成第二个活动时,我的内存大小减少到16MB,因此提示它没有从堆栈中完全删除,因为第一个活动的原始内存大小为10MB。完成后如何从堆栈中完全移除活动?

现在,当我回到第二个活动时,它给出了下面的崩溃,显示我没有重新创建点击按钮时发布的位图。每次用户输入该活动时,我都会在第二个活动中使用相同的onCreate方法,所以它应该从xml中再次获取位图。

06-26 08:45:39.636: E/AndroidRuntime(6265): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected] 

我在这里失踪了什么?一旦完成,如何从堆栈中完全移除活动?

我尝试在活动二上使用android:launchMode="singleTop"android:clearTaskOnLaunch="true",在活动二上使用android:launchMode="singleTop" android:noHistory="true"

任何建议将不胜感激。

+1

认为我们需要为您的活动添加更多的代码。我不会使用.recycle()我会确保你不会丢失对你的上下文(activity)的引用 – Blundell

+0

如果你打算重用你的第二个activity,那你为什么要回收它? –

+0

我希望第二个活动从堆栈中完全删除,一旦我调用完成(),并重新创建时,我再次调用它。这对应用程序至关重要。 –

回答

1

为了从系统的应用程序堆栈中删除应用程序,您可以杀死它的进程。也许这有帮助?

/************************************************************************************** 
* Removes this application from the stack by killing it's process. 
**************************************************************************************/ 
public static final void killProcess() 
{ 
    //get current process id 
    int processId = android.os.Process.myPid(); 

    //tell android to kill this process 
    android.os.Process.killProcess(processId); 
} 
+0

...?如果我读了这个权利,这会杀死整个应用程序。当你只想从其中一项活动中回收记忆时,这可能不是一件好事。 – cHao

+0

是的,这会杀死进程。我只想在完成调用时删除活动的内存,并在下一次调用时重新创建它。 –

1

一旦光洁度得到所谓的onDestroy也将被调用和整个活动将被清零,但即使你想手动试一下,你可以尝试堆清除或可以调用垃圾收集器。供您参考:

// For stack clear 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

// For calling GC 
System.runFinalization(); 
System.exit(0); 
+0

这是什么意图? –

+0

这没有帮助.. –