2013-05-01 15 views
2

我有一个AsyncTask,它从Web服务提取信息并显示在UI中。这要求我每次启动应用程序时都要获取信息,这会浪费带宽,并且在启动应用程序时需要很长时间才会显示信息。如何使用SQLite数据库存储来自web的同步数据 - 线程安全

我想将获取的信息存储在本地SQLite数据库中,并且每隔一段时间将其与Web服务中的数据同步。

什么是最好的方法来做到这一点?

如果我为数据库创建另一个AsyncTask,并在应用程序启动后立即运行它,那么我可能会遇到数据库更新的竞争条件,因为我正在从其中读取信息以显示在UI中。什么建议这个?我想这是一个普遍的问题,但我没能找到合适的关键词来寻找答案...

感谢

编辑:我分API级别为8个,因此任何解决方案应该与它的工作或在支持库中提供。

回答

2

如果您想在SQLite数据库的本地缓存数据,请考虑创建一个Content Provider,它提供了SQLite数据库的包装,还允许您使用Loaders,它可以从数据库中提取信息并自动将您的UI更新为底层数据发生变化。

+0

由于使用本服务的API,如2010年GoogleIO mentionned,我会读到它看看。我注意到装载机仅适用于较新的API级别,而我的最小API级别为8.因此,如何在较旧的API级别将GUI与数据库同步? – tbkn23 2013-05-01 20:01:16

+0

@tbkn - 装载机也位于支持库中,可用于API级别4:http://developer.android.com/tools/extras/support-library.html – ianhanniballake 2013-05-01 21:46:40

0

我不鼓励你使用AsyncTask来执行任何网络调用。正如你提到的那样,当Activity再次启动时,包括当你改变设备的方向时,AsyncTask会再次创建。 装载程序比较好,但是它们还没有被创建来执行请求调用,因为尽管当您的活动恢复时不会再创建装载程序,装载程序将会恢复,但会从头开始重新启动它。

最好的办法是因为要执行从远程服务器上,我建议本地数据库中的一些数据持久化,你使用RESTDroid

+0

是的,AsyncTask是我使用的临时解决方案,我不打算继续使用它(也许只能根据请求手动同步)。我发布了另一个问题,在进一步研究之后有点不同。看看你是否可以帮忙:http://stackoverflow.com/questions/16433709/syncing-a-rest-service-with-an-android-app?noredirect=1#comment23570228_16433709 – tbkn23 2013-05-08 08:00:55

相关问题