• 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--------

  • 相关阅读:
    在Maven中怎么配置外部Jar
    eclipse+jetty+web项目调试---不显示源码
    Java中的BIO,NIO,AIO分别是什么
    Eclipse启动的时候提示:Failed to load JavaHL Library
    一个电脑安装两个jdk版本
    Archive for required library: 'D:/Program Files/Apache/maven-repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar'
    Sybase PowerDesigner 16.5注册码
    DI:Defect Index(缺陷率)
    使用jave2将音频wav转换成mp3格式
    java实现zip,gzip,7z,zlib格式的压缩打包
  • 原文地址:https://www.cnblogs.com/halzhang/p/2108470.html
Copyright © 2020-2023  润新知