【发布时间】:2016-04-09 17:49:17
【问题描述】:
这建立在 earlier question 之上,这是一个 PoC。
上图显示了我的应用中工作的基本设置。
在实时应用程序中,我在Fragment 的onOptionsItemSelected() 方法中调用IntentService,如下所示:
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
...
...
Intent myServiceIntent = new Intent(getActivity(), MyService.class);
getActivity().startService(myServiceIntent);
...
...
}
MyService 从云端下载数据并将其保存到本地 SQLite 数据库中。接下来,同一Fragment 中的AsyncTasks 使用数据更新另一个Fragment。关键是,AsyncTask 应该开始他们的doInBackground() 在 MyService 完成之后。
PoC 与Service 配合得很好,显示了ProgressBar 并通过BroadcastReceivers 不断更新 UI 的中间结果。请注意Service 是从AppCompatActivity 调用的,但在实际应用程序中,它是从Fragment 调用的。完全相同的设置失败,没有ProgressBar,没有临时更新。来自BroadcastReceivers 的日志消息在AsyncTasks 完成后显示。
那么问题是,
-
IntentServices 是否天生会阻止 UI,例如AsyncTaskget()? PoC 的答案是否定的,但在我的实时应用中,临时进度更新失败。 -
AsyncTask如何等到IntentService完成? - 为什么
BroadcastReceiver中的日志只有在AsyncTasks 完成后才显示? - 这种情况很常见,是否有最佳实践来克服这种情况?
请原谅冗长,但希望情况清楚。如有歧义,请发表评论。
请注意,我见过this answer 等,但不幸的是,没有一个真正适合我。
提前非常感谢!
【问题讨论】:
标签: android android-fragments android-asynctask intentservice