Android 活动泄漏
假设您有一个包含两个活动的应用程序:活动A(启动器),带有启动活动B的按钮。重要的活动B代码是:Android 活动泄漏,android,android-activity,memory-leaks,Android,Android Activity,Memory Leaks,假设您有一个包含两个活动的应用程序:活动A(启动器),带有启动活动B的按钮。重要的活动B代码是: final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); @Override protected void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceSt
final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
@Override
protected void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
setContentView(....);
Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException( Thread thread, Throwable ex )
{
}
});
}
活动B为其接口加载一些位图。它不会在退出时还原旧的默认未捕获异常处理程序。正在执行A->B->A->B。。。由于活动B泄漏,导致内存不足异常。为什么活动B会泄漏?在我看来,这是错误的体系结构。对于链式搜索,每个
活动都应该只有一个实例。您应该通过调用startActivity()
并在您使用的Intent
中设置Intent.FLAG\u Activity\u REORDER\u TO\u FRONT
在不同的Activity
实例之间切换。还可以在Intent
中添加要显示为“额外”的数据
为了能够使用“后退”按钮返回整个链(无论它有多长),每个活动
都应该管理一个堆栈,其中包含每当用户返回页面时重新创建页面所需的数据。在onCreate()
和onNewIntent()
中,应将数据(来自“extras”)推送到堆栈上并显示。然后,通过调用startActivity()
,并在所使用的Intent
中设置Intent.FLAG\u Activity\u REORDER\u to \u FRONT
来覆盖onBackPressed()
,并返回到上一个活动。您还可以在意图中添加一个“额外”来表示用户想要“返回”。在onBackPressed()
中,您还应该丢弃剩下的活动
数据堆栈的顶部元素。这将确保当用户返回此活动时堆栈是正确的
在onNewIntent()
中,如果用户刚刚返回到活动
,您只需显示已位于托管数据堆栈顶部的数据
通过这种方式,每个活动只有一个实例,用户可以整天通过一组活动进行链接,后退按钮始终有效,您不必担心内存不足
尝试使用taskAffinity
或Intent
标志或类似标志来完成此操作将无效。不要浪费你的时间。这也是一种糟糕的编程风格
我希望这是清楚的。
对于内存异常,请使用添加清单
android>v3
<application
....
android:largeHeap="true">