android asynctask 导致另一个活动

Posted

技术标签:

【中文标题】android asynctask 导致另一个活动【英文标题】:android asynctask result in another activity 【发布时间】:2018-06-05 12:27:15 【问题描述】:

我有一个 Activity A 和一个 AsyncTask,它们进行一些计算并将数据存储到数据库中。这些操作大约需要 3-5 秒。在按下“保存”按钮并启动新的 Activity B 后调用 AsyncTask(此 Activity B 并不重要)。还有Activity C,它加载我从Activity A 和AsyncTask 中存储的数据。这是我的问题 - 如果我启动 Activity C 并且 AsyncTask 仍然没有完成存储数据,我想显示加载动画,直到 AsyncTask 完成并且可以在 Activity 中加载数据。

我有一个愿景,即 onPostExecute 方法中的 AsyncTask 将更改全局变量“boolean finished = true”,并且在启动 Activity C 后,我将定期检查变量是否为真。但我认为,这不是正确的方法。 那么,正确的方法是什么? 谢谢

【问题讨论】:

为什么不在onPostExecute 本身中启动活动C?? @Xenolion 因为用户可能还不想显示活动 C 然后显示一个对话框并在执行后声明一个全局booleanisFinished= false,将变量更改为true。如果用户点击去C,首先检查isFinished = true是否显示一个toast告诉用户等待! 【参考方案1】:

您可以在活动 C 中做的是检查 onResume 中的数据库是否已经存在您的预期结果。如果它在那里,只需显示您的结果。如果它不存在,则显示您的加载图标并注册一个监听特定事件的广播接收器。

AsyncTaskonPostExecute 中,您可以广播该特定事件。当活动 C 接收到该事件时,它可以简单地重新检查结果所在的数据库。

【讨论】:

这会变得很棘手。假设活动显示加载,因为数据不存在。它有一个用于广播的接收器。现在显然您应该始终在 onPause/onStop 中删除接收器以避免出现问题。假设用户在活动接收到广播之前按下了主页。现在重新打开时,不会调用 onCreate 并且进度是无限的,因为广播错过了。所以也要检查 onResume 中的数据。 是的,这绝对取决于您将添加和删除接收器的位置,这也是必须进行数据库检查的位置。我将更新我的答案以执行onResume 中的步骤,而不是onCreate @GlennCodes 如果我不知道预期结果怎么办?我不知道将存储多少条记录。我的数据库将存储 id (of table)、id_player、round_of_match、points、goals 和其他玩家的属性。在每场比赛之后(按下 Save match 按钮),AsyncTask 将开始为比赛中的每个玩家保存这些记录

以上是关于android asynctask 导致另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

android 从扩展 AsyncTask 创建一个对象并将其发送到另一个活动

使用 AsyncTask 中的 onPostExecute 方法列表项单击事件调用 Android 中的另一个活动

Android:AsyncTask 需要一个上下文来在离开包含活动后显示警报

android:如果一个 AsyncTask 已经在运行,则阻止另一个 AsyncTask 执行

停止 AsyncTask 会导致服务结束

当 AsyncTask 中的 catch() 抛出错误时转到另一个活动