【发布时间】:2015-05-06 15:22:45
【问题描述】:
我有一个带有单个 Activity (MainActivity) 的 Android 应用程序。我还有一个静态变量 (foo),需要使用 MainActivity 启动和停止。 foo 的生命周期必须匹配 MainActivity 的整个生命周期,而不是它的可见生命周期,也不是它的前台生命周期。以下是基本要点:
static Foo foo;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
foo.start();
}
protected void onPause()
{
super.onPause();
if (isFinishing())
disposeFoo();
}
protected void onDestroy()
{
super.onDestroy();
disposeFoo();
}
private void disposeFoo()
{
if (foo.isRunning())
foo.stop();
}
我会时不时地收到一个崩溃报告,上面写着:Foo 已经在运行时启动。
我可以整天从应用启动器启动和停止 MainActivity,并且不会发生这种崩溃。据我所知,也没有人在 MainActivity 上调用 startActivity。
在同一应用程序中的旧实例上运行 onDestroy 之前创建 MainActivity 的新实例并调用 onCreate 是否是预期行为?在什么情况下会出现这种情况?我应该使用不同的模式来初始化库、数据库和其他单例对象吗?
【问题讨论】:
-
Foo的确切定义在哪里?它是否从 Android API 扩展了一些东西?您可以发布该异常的完整堆栈跟踪吗? -
不幸的是,我的代码库中有几个不同的 'Foo',而我的 MainActivity 远没有上面那么简单。我的 Foos 中最令人沮丧的是 SQLiteOpenHelper 的子类,而我的 'Foo has been started while already running' 是 IllegalStateException: Attempt to reboot an already closed database。
-
我明白了,但仍然不足以为您提供适当的帮助。发布完整的堆栈跟踪。
-
我理解你的沮丧,但是这个没有真正的堆栈跟踪,因为没有真正的代码。在这个玩具示例中,堆栈跟踪是 foo.start(),由 MainActivity.onCreate() 调用。我希望通过找到一种不同的方式来构造第三方库的初始化以及与数据存储的实例化/交互,从而避免未来的维护。也许我需要以某种方式将我的问题分开......我有兴趣了解为什么我的活动会在同一个应用程序中重新实例化,并且我有兴趣在一个更好的地方放置我的启动代码。
-
IllegalStateException 是一个异常,应该有一个堆栈跟踪。沮丧?不你错了。你是寻求帮助的人,而不是我。我只是想帮忙,但你不会让我。做我的客人:)
标签: android android-activity activity-lifecycle