并发安全的 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;

}

}

}

你可能感兴趣的:(并发安全的 adapter)