0

正如我在此处发布的Need SQLite to replace only rows with new information一样,我需要从网络服务器获取信息并将其与我的 SQLite 数据库中的信息进行比较。(安卓应用)

我目前实现了一个 AsyncTask,它给了我一个 HashMap。当我遇到 Loaders 时,我正在编写 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,这不是我正在做的。

谢谢

4

1 回答 1

0

AsyncTask 在非 UI(通常称为“后台”)线程上运行代码。AsyncTask 可以做任何事情,但它有点脆弱,因为如果系统重新启动启动 AsyncTask 的 Activity,它就会消失。这很容易发生,因为如果用户旋转设备,系统会重新启动当前的 Activity(除非您捕获 onSystemConfigurationChanged)。

形式上,AsyncTaskLoader 是使用 AsyncTask 运行其代码的加载器。这实际上意味着 AsyncTaskLoader 通过使用非 UI 线程(AsyncTask 部分)从某处获取数据。加载器部分只是为您提供了处理获取数据过程的便捷方法,这可能需要很长时间。加载器部分还允许您跟踪数据并在数据更改时重新启动加载。

根据您所说,您当前的实现可以使用 AsyncTask 或 AsyncTaskLoader。如果需要Loader的功能,选择AsyncTaskLoader;否则,坚持使用 AsyncTask。

您不能使用 CursorLoader。虽然不是很明显,但您需要一个内容 URI 来创建 CursorLoader,这意味着您需要一个内容提供者。在您的情况下,使用 CursorLoader 没有明显优势。CursorLoader 在 AsyncTaskLoader 之上添加了一些东西,例如当原始 CursorLoader 查询的内容 URI 的数据发生变化时自动触发重新加载的内置 ContentObserver。

基本上,您只是在查看为越来越多的特定情况添加功能的类定义层。

说了这么多,我看到您希望确保 Web 服务器的数据库和设备的数据库始终“同步”。正确的?

您可以随时判断内容提供程序中的行何时发生更改,因为您可以为提供程序注册一个 ContentObserver。当应用程序中的某些内容试图改变正在“观察”的数据时,您会收到一个回调。系统通过将传递给 ContentResolver 调用的 URI 与您注册观察的 URI 进行比较来检测突变。不幸的是,您不能对 SQLite 数据库执行此操作。

如果网络服务器上的数据发生变化,您可以使用 Google Cloud Messaging 通知设备。

在这两种情况下,您都可以创建一个同步适配器来处理数据传输和同步任务,并在数据更改时运行它。

棘手的部分是决定如何处理冲突,但您只是在寻找更新和添加(和删除?)。

于 2013-06-26T23:56:18.213 回答