【发布时间】:2012-02-26 10:24:58
【问题描述】:
我有三项活动,我们称它们为一、二和三。从活动一开始,按下按钮开始活动二。从活动二开始,按下按钮即可开始活动三。
足够简单。
现在,活动三需要可从应用程序访问的一些数据(可能存在也可能不存在)。在 THREE 的 onResume() 方法中,对数据进行检查,如果不存在则完成活动,如下所示:
@Override
protected void onResume() {
super.onResume();
/* ... get data from app ... */
if (data == null) {
Toast.makeText(this, "Data not found", Toast.LENGTH_SHORT).show();
finish();
return;
}
/* ... other logic ... */
}
当data == null,三完成,销毁并返回二。一切都很好。
现在在 TWO 中,按下后退按钮在 TWO 上调用 finish(),但 TWO 从不调用 onDestroy()。用户返回到 ONE 就好了,但是任何随后返回到 TWO 的意图都不起作用,并且不会引发任何错误。 TWO 处于已完成(并暂停)但从未销毁的状态,因此无法恢复。
那么,在这种情况下,为什么三个重要?如果我删除上面代码块中的finish() 调用,并依靠“自然”完成三(通过使用后退按钮),当用户返回一时,二已被正确销毁。
好吧,这就是真正令人困惑的地方......
留下finish() 调用,我可以通过直接从ONE 启动三个来缓解挂断,然后“自然”完成它(返回按钮)。 THREE 被销毁(第二次)后,TWO 按预期打开。
我读到的所有内容都表明我应该可以在onResume() 内调用finish() 进行活动。但在这种情况下,它会使某些东西处于不良状态,并阻止我破坏调用活动。
想法?还是我把你的大脑翻过来了?
编辑:
进一步探索发现了这颗宝石......
用大约 500 毫秒的 postDelay() 处理程序将 THREE 中的 finish() 调用包围起来,这将允许 TWO 按预期关闭。像这样:
@Override
protected void onResume() {
super.onResume();
/* ... get data from app ... */
if (data == null) {
Toast.makeText(this, "Data not found", Toast.LENGTH_SHORT).show();
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
}, 500);
return;
}
/* ... other logic ... */
}
不完全是我的修复想法...
【问题讨论】:
-
这是什么数据?从事物的声音来看,当 THREE 进入 onCreate() 时,该数据应该存在(不为空)。偏远的问题是 onResume() 数据为空的事实吗?或者数据是否会过时、失效或无用?
-
如果您采用多线程等待,您的架构似乎有严重问题...我有一个可能的答案,但在您回答“数据”是什么以及为什么它在简历中为空之前,我将推迟回答因为它可能/可能不是答案。
-
@GrahamSmith 说实话,你是对的,数据不应该为空。但是在测试一个可能为空的边缘案例时,我们偶然发现了这个问题。如果我们不能很快解决它,我们将忽略边缘案例。 :) 数据是根据意图中的“id”填充的。然后将该“id”传递给应用程序中的公共方法以检索查看数据缓冲区或本地数据库的对象(数据)。
-
@GrahamSmith 让我澄清一下,多线程方法不是我打算做的。有趣的是它以某种方式解决了这个问题。
-
好的,那么直截了当的问题 - 数据是否仅在 onResume() 上为空,或者它可以在三个的 onCreate() 中为空?
标签: android onresume activity-finish