我想创建一个ContentProvider,它充当远程服务器上信息的代理。服务器可能会自动更新其信息并将该更新发送到我的ContentProvider。我的目标是建立一个ListView,显示从ContentProvider检索到的数据,并在基础数据发生变化时自动更新。
我的问题:如果客户端使用ContentResolver访问我的ContentProvider,并且他们使用query()方法获得Cursor,那么如果新数据到达,他们将如何得到通知?也就是说,Cursor对象本身会以某种方式被通知吗?这个Cursor可观察性如何工作?
仅供参考,我想在ContentProvider中使用MatrixCursor,如果这会改变任何内容。
答案 0 :(得分:1)
您的ContentProvider应该为更改的URI调用ContentResolver.notifyChange()。您应该使用v4兼容jar中提供的Loader API(它随蜂窝一起提供,以后再使用),让您的Activity或Fragment实现LoaderManager.LoaderCallbacks接口,并在调用notifyChange时处理更新UI。
文档: http://developer.android.com/guide/topics/fundamentals/loaders.html
教程: http://mobile.tutsplus.com/tutorials/android/android-sdk_loading-data_cursorloader/
答案 1 :(得分:0)
这不是问题。使用registerContentObserver()在游标上注册内容观察者。如果你的是唯一一个正在查看数据的应用程序,则没有必要使用ContentProvider。
此外,轮询服务器可能更容易,而不是推送更新。毕竟,即使数据发生变化,设备用户也不会关心他/她正在查看数据。如果您的活动到达前台,您可以自动同步到服务器或询问用户是否要同步。请记住,您无法保证与网络连接,因此最好在网络可用时拉动而不是推送。而且更简单,因为服务器不必弄清楚您的设备是否可用。
在code.google.com上搜索C2DM以进行推送。对于pull,请考虑使用同步适配器。 SampleSyncAdapter中有一个例子。