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

时间:2010-12-01 09:21:24

标签: android sqlite

我正在试图找出访问多个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 个答案:

答案 0 :(得分:2)

你看过这个演讲了吗? http://www.youtube.com/watch?v=xHXn3Kg2IQE

我发现它是一个很好的灵感来源。 基本上,他们建议将服务助手(在您的情况下,作为您的意图服务的服务助手)构建为单例类。您可以跟踪正在进行的请求

通过这种方式,您可以跟踪正在执行的每种不同类型的正在进行的后台任务,并阻止任何其他同类请求。例如,如果您保留活动a并输入活动b,并且他们要求提供相同的Web服务查询,则可以检查由于活动a它仍在进行中。

从我在iosched app上看到的情况来看,它遇到的问题是如果活动被关闭,那么获取结果就会丢失。

有一个明确的日志说:

Log.w(TAG, "Dropping result on floor for code " + resultCode + ": " + resultData.toString());

我也不建议使用asynctask,因为结果也会丢失。

但是,请看一下谈话和幻灯片。