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
然后显示一个对话框并在执行后声明一个全局boolean
isFinished= false
,将变量更改为true
。如果用户点击去C
,首先检查isFinished = true
是否显示一个toast告诉用户等待!
【参考方案1】:
您可以在活动 C 中做的是检查 onResume
中的数据库是否已经存在您的预期结果。如果它在那里,只需显示您的结果。如果它不存在,则显示您的加载图标并注册一个监听特定事件的广播接收器。
在AsyncTask
的onPostExecute
中,您可以广播该特定事件。当活动 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 需要一个上下文来在离开包含活动后显示警报