adapter.notify()、notifyAll()、notifyDataSetChanged ()、notifyDataSetInvalidated ()的区别

来源:互联网 发布:灵族捏脸数据 编辑:程序博客网 时间:2024/05/18 19:20

adapter.notify()notifyAll()notifyDataSetChanged ()notifyDataSetInvalidated ()的区别

notify()notifyAll()一般用于唤醒被锁或等待中adapter的情况:

notify()notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。

void notify(): 唤醒一个正在等待该对象的线程。

void notifyAll(): 唤醒所有正在等待该对象的线程。

两者的最大区别在于:

notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。

notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notifynotifyAll,它们等待的是被notifynotifyAll,而不是锁。

 

notifyDataSetChanged和notifyDataSetInvalidated 一般用于adapter的数据发生变化的时候调用:

notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。

 

public void notifyDataSetChanged ()

 

该方法内部实现了在每个观察者上面调用onChanged事件。每当发现数据集有改变的情况,或者读取到数据的新状态时,就会调用此方法。

 

public void notifyDataSetInvalidated ()

 

该方法内部实现了在每个观察者上面调用onInvalidated事件。每当发现数据集监控有改变的情况,比如该数据集不再有效,就会调用此方法。

今天用到Listview刷新功能,之前解决都是给Listview重新负上adapter这样listview就滚动到第一条了,但是这样会有些耗内存,程序写法也不美观。理论上是这样的,需要实验一下,重要的是一下两句话!

notifyDataSetInvalidated(),会重绘控件(还原到初始状态)

notifyDataSetChanged(),重绘当前可见区域

阅读全文
1 0
原创粉丝点击