天天看点

Adapter中notify(),notifyAll(),notifyDataSetChanged(),notifyDataSetInvalidaded()方法的区别

1.notify()与notifyAll()

notify()和notifyAll()一般用于唤醒被锁或等待中的adapter,两者都是object对象用于通知处在等待该对象的线程方法。notify唤醒一个正在等待该对象的线程,notifyAll唤醒所有正在等待该对象的线程。两者最大的区别是,notifyAll使所有原来在该对象上等待被notify的线程全部退出wait状态,变成等待该对象上的锁,一旦该对象解锁,它们就会去竞争。notify只是选择一个wait状态线程通知,并使它获得该线程的锁,不惊动其他同样在等待被该线程notify的线程,当第一个线程运行完毕后,释放该对象的锁,此时如果该对象没有再次使用notify,即便该对象已经空闲,其他wait状态等待的线程没有接收到该对象的通知,会继续处在wait状态,直到这个对象再次发出notify或者notifyAll。它们等待的是被notify或者notifyAll,不是等待锁。

2.notifyDataSetInvalid()与notifyDataSetChanged()

notifyDataSetChanged()和notifyDataSetInvalid()一般在adapter数据发生变化时调用。notifyDataSetChanged通过一个外部的方法强制控制,如果adapter的内容发生改变时,需要强制调用geiView()方法更新item中的内容,该方法在内部实现了每个在观察者上面调用的事件,每当发现数据集有变化的时候或读取到数据的新状态,就会调用此方法。notifyDataSetInvalid方法内部实现了每个观察者上调用onInvalidated事件,每当发现该数据集有改变时,比如该数据不在有效,就调用此方法。(注:notifyDataSetInvalid会重新绘制控件还原到初始状态,notifyDataSetChanged重新绘制当前可见区域。)