我的应用程序需要首先从两个不同的Web服务(JSON)下载数据并将其导入到其本地数据库(Realm)中。我有两个需要显示来自这些Web服务的数据的活动。第一个(HomeActivity)是应用程序加载的初始活动。第二个(LineupActivity)是从HomeActivity导航到它时创建的。
目前,我已经创建了一个Application类(扩展Application),以便处理Web服务的下载和导入。在它的onCreate()中,它调用两个方法,即下载和导入每个Web服务的AsyncTasks。
我将此下载/导入过程添加到Application类的原因有两个:
我接触过这个错误吗?我应该将Web服务下载/导入逻辑移出Application类吗?此外,Application类的onCreate()是否被多次调用?这意味着,我知道它只在应用程序的生命周期中被调用一次,但Android OS最终是否会杀死一个应用程序并让它在再次启动时调用Application类中的onCreate()?我希望应用程序在启动时下载新数据,但不是每次用户都将应用程序置于焦点时。
答案 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}}中的值。
您还可以使用基本活动实现继承,并在其中包含必要的下载检查逻辑并扩展您的类。启动画面总是有助于启动下载。