在app中下载/导入Web服务的推荐设计方法

时间:2015-01-15 16:47:01

标签: android

我的应用程序需要首先从两个不同的Web服务(JSON)下载数据并将其导入到其本地数据库(Realm)中。我有两个需要显示来自这些Web服务的数据的活动。第一个(HomeActivity)是应用程序加载的初始活动。第二个(LineupActivity)是从HomeActivity导航到它时创建的。

目前,我已经创建了一个Application类(扩展Application),以便处理Web服务的下载和导入。在它的onCreate()中,它调用两个方法,即下载和导入每个Web服务的AsyncTasks。

我将此下载/导入过程添加到Application类的原因有两个:

  1. 我希望尽快下载所有应用数据,所以 当导航到第二个活动时,它不需要启动 另一个下载。
  2. 这些活动都刷了刷新。他们调用Application类中的每个相应方法来重新下载/导入 网络服务数据。
  3. 我接触过这个错误吗?我应该将Web服务下载/导入逻辑移出Application类吗?此外,Application类的onCreate()是否被多次调用?这意味着,我知道它只在应用程序的生命周期中被调用一次,但Android OS最终是否会杀死一个应用程序并让它在再次启动时调用Application类中的onCreate()?我希望应用程序在启动时下载新数据,但不是每次用户都将应用程序置于焦点时。

4 个答案:

答案 0 :(得分:0)

我想你无论如何都可以接近这个,虽然我想实现这里提到的三个选项之一:https://dl.google.com/googleio/2010/android-developing-RESTful-android-apps.pdf

演示文稿本身可以在这里找到:https://www.youtube.com/watch?v=xHXn3Kg2IQE

但是,这没有提到你应该如何在启动时同步。但您可以在应用程序类中设置SharedPreference,然后使用其中一种模式在后台同步。

答案 1 :(得分:0)

我建议你不要使用应用程序下载你的东西来使用Service。如果你的应用程序被操作系统杀死,你的dl将永远无法完成。使用服务它会。

此外,您可以使用活动Broadcast来{s ignalize that the service has completed downloading and taking the necessary following steps

答案 2 :(得分:0)

首先:我认为将下载放在appliaction onCreate上是不好的 如documentation

中所述
  

在应用程序启动时,在任何活动,服务之前调用   或创建了接收者对象(不包括内容提供者)。   实现应该尽可能快(例如使用懒惰   初始化状态)因为在这个函数中花费的时间   直接影响开始第一项活动的表现,   服务或流程中的接收者。如果重写此方法,请执行   一定要打电话给super.onCreate()。

注意这一部分 实现应该尽可能快(例如使用状态的延迟初始化),因为在此函数中花费的时间直接影响启动第一个活动的性能 因此,下载或导入的任何延迟都可能导致第一个活动延迟。 并且行为不清楚,黑屏也许?

第二次下载/导入建议: 1-在第一个活动中使用AsyncTask,您可以在其中显示一个小进度条,指示下载/导入过程,甚至阻止整个UI直到完成(基于您的业务)

2-下载数据时添加闪屏

关于新数据,您可以存储时间戳,last_updated 在开始下载/导入过程之前,检查该值,如果小于您接受的值(比如1小时),请不要开始下载/导入。

终于,关于onCreate()调用,我认为它不是每次调用,只有在重新创建应用程序时,例如重新启动后的第一次运行,或者被杀或被强制关闭后

答案 3 :(得分:0)

我接触过这个错误吗?
在这种情况下,“错误地”是一个非常相对的术语 隐喻,它与context从不null,但不确定boolean不正确是真是假。

我应该将Web服务下载/导入逻辑移出Application类吗?
我会说是,因为下载逻辑与O.S.无关。并且应用程序在其内存中存活。您的要求似乎并不复杂。如果下载是大量数据,则需要Service,如果没有必要,请不要这样做。

此外,Application类的onCreate()是否被多次调用?意思是,我知道它只在应用程序的生命周期中被调用一次...再次启动时的应用程序类?
不,如果没有应用程序被杀死并重新启动,它将不会被多次调用。你所说的是正确的,但是对于你的要求,可能有更有效和更轻松的方法来做,而不是将它与Application类结合起来。


对于其余的逻辑,您可以将Asynctasks实现为一个单独的类,并实现接口,这些接口是您的任务结果的回调。这有助于刷卡到刷新功能。

在文档参考方面,Application class

  

通常不需要子类Application。在大多数情况下,   静态单例可以在更模块化的情况下提供相同的功能   方式。

你的情况就是这样。

您需要确定的一件事是时, 需要刷新/下载数据的频率。只需启动应用或每天一次,您就可以在SharedPreferences中存储日期/日期,并检查onResume()的{​​{1}}中的值。

您还可以使用基本活动实现继承,并在其中包含必要的下载检查逻辑并扩展您的类。启动画面总是有助于启动下载。