Android开发——利用Cursor+CursorAdapter实现界面实时更新(转)
好久没有更新博客了。不是没时间写,而是太懒。而且感觉有些东西没有时间总结,之之后再想写,就想不起来了。晚上新发现一点东西,所以就及时写下来。
最近利用业余时间在看Android的Download模块,看得是2.3之前版本的源码,2.3之后android就开放了一个下载管理器,并提供了一些api。不过想对下载模块有更深入的了解还是必须自己花点时间看看downloadprovider的源码。相信会收获很多。如果有时间想写写文章对downloadprovider进行分析。
这篇文章不是分析download的,不过却是我从读download的源码发现的。
情景分析:
我们有一个Service,这个Service在后台会不断的更新多条数据,我们又想将不断更新的数据展现在ui上面这时你是怎么解决的呢?其实就是类似有些浏览器的下载管理器界面,有没有想过是怎么实现的??
解决方案:
1,使用通知,只能在通知栏看到更新,加入用户想在一个activity中有个进度显示呢?
2,发送更新广播,当是在一个listView中的多个列需要更新广播就有点吃力了;
还有吗?
参考方案:
利用Provider将数据持久化,再用Cursor监听Provider的变化来更新数据。当然这需要中Service update数据。
-----部分代码-------
//一个观察者
private?class?MyContentObserver?extends?ContentObserver {
?
public?MyContentObserver() {
super(new?Handler());
}
?
@Override
public?void?onChange(boolean?selfChange) {
super.onChange(selfChange);
Log.i("DLA",?"MyContentObserver onChange!");
//处理数据更新回调
refreshData();
}
?
}
?
private?void?refreshData() {
if?(mCursor.isClosed()) {
return;
}
//更新
mCursor.requery();
}
?
//一个实现CursorAdapter的适配器
private?MyAdapter?mAdapter;
?
private?Cursor?mCursor;
?
private?MyContentObserver?mObserver;
?
@Override
protected?void?onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
setupViews();
mCursor?= getContentResolver().query(MyProvider.CONTENT_URI,?sAppReadableColumnsArray,
null,?null,?null);
mObserver?=?new?MyContentObserver();
//注册观察者
mCursor.registerContentObserver(mObserver);
mAdapter?=?new?MyAdapter(this, R.layout.list_item,?mCursor);
setListAdapter(mAdapter);
}
?
@Override
protected?void?onDestroy() {
super.onDestroy();
if?(mCursor?!=?null) {
mCursor.unregisterContentObserver(mObserver);
mCursor.close();
}
}
??
??
这样实现后当MyProvider.CONTENT_URI对应的数据发生变化时都会调用观察者的onChange方法,mCursor.requery()执行后listview就直接更新了。(不知道在其他类型的Adapter中是否自动更新,而不需要调用adapter的notifyDataSetChanged)
--------end--------
?
感谢:http://www.cnblogs.com/halzhang/archive/2011/07/16/2108470.html