当我在这里发布Need SQLite to replace only rows with new information时,我需要从网络服务器获取信息,并将其与我在SQLite数据库中的信息进行比较。 (Android App)
我目前有一个AsyncTask实现,它给了我一个HashMap。 当我遇到装载机时,我正在编写SQLite数据库。
我对如何做到这一点很困惑。
在这种情况下,我想使用CursorLoader还是AsyncTaskLoader?我是否替换了现在的AsyncTask子类?
private class getFleetList extends
AsyncTask<String, Integer, HashMap<String, ArrayList<Vehicle>>> {
@Override
protected HashMap<String, ArrayList<Vehicle>> doInBackground(
String... params) {
//...implemented AsyncTask
}
我目前的猜测是我将替换我的AsyncTask。教程链接或其他内容会非常有用。我找到的所有教程都使用广播接收器或发布到ListViews,这不是我正在做的事情。
由于
答案 0 :(得分:0)
AsyncTask在非UI(通常称为“后台”)线程上运行代码。 AsyncTask可以做任何事情,但它有点脆弱,因为如果系统重新启动启动AsyncTask的Activity,它就会消失。这很容易发生,因为如果用户旋转设备,系统会重新启动当前的Activity(除非你捕获onSystemConfigurationChanged)。
形式上,AsyncTaskLoader是一个使用AsyncTask来运行其代码的Loader。这实际上意味着AsyncTaskLoader通过使用非UI线程(AsyncTask部分)从某处获取数据。加载器部分为您提供了处理数据获取过程的便捷方法,这可能需要很长时间。加载程序部分还允许您跟踪数据并在数据更改时重新启动加载。
根据您所说的,您当前的实现可以使用AsyncTask或AsyncTaskLoader。如果需要Loader的功能,请选择AsyncTaskLoader;否则,坚持使用AsyncTask。
您无法使用CursorLoader。虽然它不是很明显,但您需要一个内容URI来创建CursorLoader,这意味着您需要一个内容提供者。在您的情况下,使用CursorLoader没有明显的优势。 CursorLoader在AsyncTaskLoader之上添加内容,例如内置的ContentObserver,当原始CursorLoader查询的内容URI的数据发生变化时,它会自动触发重新加载。
基本上,您只是在查看为更多特定情况添加功能的类定义层。
说完这一切后,我发现你想确保网络服务器的数据库和设备的数据库始终“同步”。正确?
您可以随时告知内容提供程序中的行已更改,因为您可以为提供程序注册ContentObserver。当应用程序中的某些内容试图改变“观察”的数据时,您会收到回调。系统通过将传递给ContentResolver调用的URI与您注册要观察的URI进行比较来检测突变。不幸的是,你无法为SQLite数据库执行此操作。
如果网络服务器上的数据发生变化,您可以使用Google Cloud Messaging通知设备。
在这两种情况下,您都可以创建同步适配器来处理数据传输和同步任务,并在数据更改时运行它。
棘手的部分是决定如何处理冲突,但你只是在寻找更新和添加(和删除?)。