并发安全的 adapter
问题:
Adapter的数据自己要用于getView和getCount,而且程序是getCount后在不同方法里面连续getView,这带来个问题:getCount后,数据被其他线程删除,在getView的时候越界。
解决思路:
1、建立一个ConcurrentAdapter,里面用两个List存储数据,一个是外部操作增删用,一个用来实际绘制用。
2、当外部增删后,暂时不改变内部的List,这样就不会出现越界
3、当内部再次getCount后,如果发现外部修改了List,就重新从外部Copy一次
代码:
publicclassConcurrentAdapter{
//用于外部操作的List,外部对其增删
privateListobjectsCached=newArrayList();
//用于Adapter内部计算用,从外部Copy过来
privateListobjects=newArrayList();
//用于缓存List的数量,当-1的时候,表示外部修改过List,需要更新
privateintcount=-1;
publicintgetCount(){
if(count==-1){
synchronized(objectsCached){
objects.clear();
objects.addAll(objectsCached);
count=objects.size();
returncount;
}
}else{
returncount;
}
}
publicT getObject(intposition){
returnobjects.get(position);
}
publicvoidaddObject(T object){
synchronized(objectsCached){
objectsCached.add(object);
count=-1;
}
}
publicvoidaddObjects(Listobjects){
synchronized(objectsCached){
objectsCached.addAll(objects);
count=-1;
}
}
publicvoidsetObjects(Listobjects){
synchronized(objectsCached){
objectsCached.clear();
objectsCached.addAll(objects);
count=-1;
}
}
publicvoidremoveObject(T object){
synchronized(objectsCached){
objectsCached.remove(object);
count=-1;
}
}
}