BaseAdapter 有一个方法:notifyDataSetChanged()

用途:在adapter的数据发生变化以后通知UI主线程根据新的数据重新画图。

从名字看,这个是一个notify,感觉就是发出通知了,但是通知什么时候被接受什么时候处理完成是不定的。

事实上其实也是这样的。

这个方法的实现:

public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

再往下,会调用一个observer.onChanged();

那么,mDataSetObservable是什么呢?

我理解是

public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

设置进来的,这个应该是跟view相关的,比如说看GridView的setAdapter方法里面有:

mDataSetObserver = new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);

AdapterDataSetObserver类里面有onChanged方法的实现

里面有调用一个requestLayout();

View的requestLayout()会调用mParent.requestLayout();

跑到ViewRoot的

public void requestLayout() {
        checkThread();
        mLayoutRequested = true;
        scheduleTraversals();
    }

scheduleTraversals的实现

public void scheduleTraversals() {
        if (!mTraversalScheduled) {
            mTraversalScheduled = true;
            sendEmptyMessage(DO_TRAVERSAL);
        }
    }

所以,其实notifyDataSetChanged是发送了一个message给主线程,告诉它,要重画了啊。

之所以看这个,其实跟之前bitmap recycle的时间点的问题是相关联的。

例如有一个grid view,它跟一个adapter捆绑,adapter用到的数据包括现实在grid每个item的bitmap,在数据刷新的之后,调用notifyDataSetChanged通知UI重画,那旧的bitmap要在什么时候recycle比较合适合理?

近来觉得message queue真的是很好用的东西,这里,recycle不要直接调用【直接调用的话,没有办法保证notifyDataSetChanged的通知什么时候被处理完,万一没处理完,recycle掉了图片,又想找图片画画面的时候就麻烦了】,而是在notifyDataSetChanged后面再丢message/runable到queue里面,让UI主线程recycle旧图片。这样就保证了只有UI上bitmap已经设置为新的了,旧的才会被recycle掉。

BaseAdapter notifyDataSetChanged()相关推荐

  1. 动态改变ListView布局

    在getView()时,通过判断选择加载不同的布局. 点击某个item的时候,变为foucus状态,其他的items还原. 下面用两个方法给item设置两个不同的布局. //foucus状态,显示一个 ...

  2. Android-通讯录

    代码来源:Android移动开发教程(项目式) 工程文件:https://download.csdn.net/download/m0_53397360/13669859 整体结构: 1.activit ...

  3. Android入门知识全套笔记

    安装apk: 开发完成之后,需要buildAPK,再次发送才能运行. adb install -r (apk完整路径) 安装在第三方app 系统级app需要把打包好的apk,浦西 卸载apk:adb ...

  4. preference的解析与显示

    一.preference的xml解析过程 解析触发流程: 在一个继承自PreferenceActivity类的子类中调用addPreferencesFromResource(R.xml.voicema ...

  5. 仿QQ、微信翻页查看聊天记录

    主界面MainActivity.class public class MainActivity extends Activity implements OnScrollListener{private ...

  6. Android 短信发送失败是如何监听到的

    之前做项目,遇到需求:在短信发送失败后,弹出对话框,提示失败,如果用户点击retry,则开始重新发送,否则什么都不干. 高通8.0短信发送失败处理: 平台发送短信后会监听短信是否发送成功,这里主要看失 ...

  7. 从源代码的角度分析--在BaseAdapter调用notifyDataSetChanged()之后发生了什么

    导师安排我做一个小项目,其中涉及到利用Adapter作为ListView的适配器,为ListView提供数据.选中某一项后,要让这一项变成选中状态,也就是背景图片要换一下.下面我就用一个小例子来模拟. ...

  8. BaseAdapter 的notifyDataSetInvalidated 和notifyDataSetChanged

    写了一年的多的android代码,都没有明白notifyDataSetInvalidated 和notifyDataSetChanged是什么原理. 今天就来好好了解. 我们一直以来,在listVie ...

  9. BaseAdapter的notifyDataSetChanged方法

    都用过 BaseAdapter的notifyDataSetChanged()方法,用法很简单,当BaseAdapter的数据更新了,需要更改显示,这时候就要调用notifyDataSetChanged ...

最新文章

  1. vCenter 5.5升级到vCenter 6.0实战指导
  2. 运行pyspider时出现 : ImportError: cannot import name ‘ContextVar‘
  3. 无止境的内存优化——停不下的循环
  4. 使用 fail2ban 防御 SSH 暴力破解
  5. python实现第一个web_我的第一个Python Web应用
  6. python3 json_python3 json模块
  7. android webview 像素,Android:在WebView中加载的图像中的像素质量降低
  8. PostMan-使用笔记
  9. Linux Crontab定时任务
  10. spring 获取一个包下的所有bean_面试官问我:为什么 Spring 中的 bean 默认为单例?...
  11. allennlp0.9.0问题
  12. 迅雷连接转化为http链接
  13. Mega网盘来下载外国友人分享的资源
  14. Python Selenium 抓取Shadow Dom内部元素方法更新
  15. 我喜欢邓丽君,死掉了;
  16. ue4掉落深渊返回地面
  17. 微信小程序音频的使用:wx.createInnerAudioContext的使用
  18. 70天攻克考研英语词汇-day1
  19. 基于PHP的图书管理系统
  20. C++11 ThreadPool总结

热门文章

  1. 数据规范化(标准化)
  2. python 的numpy库中的mean()函数用法介绍
  3. 什么是双亲委派,有什么好处?
  4. 网络协议分析(某国外社交软件)
  5. BSV 上的 Schnorr 签名
  6. TLP(Transmission Line Pulse)
  7. Java实验4-1【数组下标越界异常处理】
  8. POJO有哪些要求?
  9. 【移动安全高级篇】————3、Android系统ShellCode编写
  10. java 混淆war,java yguard混淆web工程