利用Cursor+CursorAdapter实现界面实时更新
这篇是转载,写得很不错,原文地址:http://www.cnblogs.com/halzhang/archive/2011/07/16/2108470.html,在此感谢原作者!
最近利用业余时间在看Android的Download模块,看得是2.3之前版本的源码,2.3之后android就开放了一个下载管理器,并提供了一些api。不过想对下载模块有更深入的了解还是必须自己花点时间看看downloadprovider的源码。相信会收获很多。如果有时间想写写文章对downloadprovider进行分析。
这篇文章不是分析download的,不过却是我从读download的源码发现的。
情景分析:
我们有一个Service,这个Service在后台会不断的更新多条数据,我们又想将不断更新的数据展现在ui上面这时你是怎么解决的呢?其实就是类似有些浏览器的下载管理器界面,有没有想过是怎么实现的??
解决方案:
- 使用通知,只能在通知栏看到更新,加入用户想在一个activity中有个进度显示呢?
- 发送更新广播,当是在一个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)
| anyShare分享到: | |
| |
发表在《
发表在《
发表在《
很久不见有更新,最近在忙什么呢?
[回复]
iStar
回复:
十月 24th, 2011 at 下午 5:32
封闭开发中。。。
多谢关注!
[回复]