将数据库包装在内容提供程序中。做起来不难,因为你已经有了数据库。不要编写自己的线程,而是使用 IntentService 获取网络数据并将其写入内容提供程序。
在您的 Activity 中,使用 CursorLoader 在后台从内容提供程序加载数据。CursorLoader 包含 onDataSetChanged() 的实现,因此每次更新内容提供程序时,都会重新加载 Cursor。每次 Cursor 重新加载时,将新的 Cursor 交换到支持 ListView 的 CursorAdapter 中。
要在 IntentService 和您的 Activity 之间进行通信,请做两件事:
- 当网络下载完成时,从 IntentService 向 Activity 发送本地广播 Intent(使用 LocalBroadcastManager)。如果您的 Activity 在前台,它将立即获得广播,并且您可以第一次启动 CursorLoader。
- 同时发布来自 IntentService 的通知。在此通知中,包含内容 Intent。如果您的 Activity 在后台并且 IntentService 完成,则用户会看到通知。然后,他或她可以单击通知返回到您的活动。如果需要,您可以关闭 CursorLoader,或者直到 CursorLoader 自动重新启动。
您的问题指出了在 Android 中编程时重新考虑应用程序结构的可取性。Android 应用程序不是线性的;它们更像是根据当前状态相互交互的巨型对象。出于这个原因,您应该避免在一个 Activity 中编写整个应用程序,或者从上到下编写它。
此外,几乎没有理由自己创建一个新的 Thread()。Android 提供了大量为您处理异步处理的类。如果您发现自己在编写 Thread() 或 run(),请小心。