一般应用程序设计(IntentService/ContentProvider/AsyncTask)

8
我正在尝试找出访问多个Web服务并具有多个活动的应用程序的最佳通用设计。我的最新Android应用程序的实现方式如下:我有一个IntentService,它接收来自活动的请求以从Web服务获取信息。我的Service通过ResultReceiver通知活动请求的状态(已启动/错误/已完成)。在调用Web服务、获取结果(XML / JSON)并解析后,我将该信息放入ContentProvider(由SQLite数据库支持),并使用ContentResolver通知任何活动进行更改。活动会被通知更改(一些使用ContentObserver,其他使用SimpleCursorAdapter并自动通知)。现在,我的方法存在以下问题:
每次进入一个活动时,我通过上述方法从Web服务请求信息,并删除该特定表中的所有行,填充新信息并通知活动。因此,如果用户按返回键然后再次进入,我会再次执行整个操作。我认为我应该在数据库中添加一些字段以记录最后更新时间等,但我不知道如何确切地进行操作。有什么建议吗?我认为另一种选择是使用闹钟,在特定时间间隔内触发更新。但在我的情况下,规范要求每次进入活动时都要检查Web服务。
当我调用Web服务时,我在活动中显示一个不确定的进度条,覆盖其他视图(其中包含以前提取的信息并保存在数据库中直到Web服务调用完成),但用户可以开始与视图交互,这不好(信息可能会从数据库中消失)。有什么方法可以禁用此交互?ProgressDialog是一个好选择。
如果我快速移动到不同的活动,则IntentService会被阻塞以前的Web服务调用,需要更长时间才能到达我的最新Web服务调用。我可以为每个Web服务创建多个IntentService,但我认为这并不是它的目的。
我有一种感觉,我采取的方法实际上并不是这个特定应用程序的最佳方法。它部分地受到Google I/O应用程序的启发(我无法理解所有内容,例如更新的SQLite字段等)。一个替代方案是在所有活动中使用AsyncTasks。但是,我在哪里存储信息以便从其他活动访问?在Application的列表中吗?ID管理如何处理?
我非常感兴趣听取您的意见/想法/建议以及如何使我的下一个应用程序工作得更好、更有效率。
1个回答

2
你有没有看过这个讲座?http://www.youtube.com/watch?v=xHXn3Kg2IQE 我觉得它是一个很好的灵感来源。基本上,他们建议建立一个服务助手(在你的情况下,是一个服务助手到你的意图服务),作为单例类。你可以跟踪正在进行的请求。
通过这种方式,你可以跟踪你正在执行的每一种不同的后台任务,并阻止任何其他相同类型的请求。例如,如果你离开活动a并进入活动b,它们都要求相同的Web服务查询,你可以检查它仍然在进行中,因为活动a正在进行中。
从我在iosched应用程序中看到的情况来看,它存在这样的问题:如果活动关闭了,则获取结果会丢失。
有一个清晰的日志,说:
Log.w(TAG,“Dropping result on floor for code ” + resultCode + “: ” + resultData.toString());
我不建议使用异步任务,因为结果也会丢失。
但是,请看一下这个讲座和幻灯片。

我之前看过这个演示,并在开发时受到了影响。但是我没有完全采用它,因为我不够自信。如果我能看到更多有关这种方法的实现细节,那会有所帮助。你可以推荐其他开源的Android应用程序吗?谢谢。 - Catalin Morosan
我也不得不从头开始重新实现它,因为我也找不到任何开源示例。很糟糕,他们没有提供关于他们谈论的内容的示例。 - fedepaol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接