码迷,mamicode.com
首页 > 其他好文 > 详细

并发安全的Adapter

时间:2015-04-07 21:48:04      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

问题

Adapter的数据自己要用于getView和getCount,而且程序是getCount后在不同方法里面连续getView,这带来个问题:getCount后,数据被其他线程删除,在getView的时候越界

解决思路

  1. 建立一个ConcurrentAdapter,里面用两个List存储数据,一个是外部操作增删用,一个用来实际绘制用。
  2. 当外部增删后,暂时不改变内部的List,这样就不会出现越界
  3. 当内部再次getCount后,如果发现外部修改了List,就重新从外部Copy一次。

代码

public class ConcurrentAdapter<T> {
    //用于外部操作的List,外部对其增删
    private List<T> objectsCached=new ArrayList<T>();
    //用于Adapter内部计算用,从外部Copy过来
    private List<T> objects=new ArrayList<T>();
    //用于缓存List的数量,当-1的时候,表示外部修改过List,需要更新
    private int count=-1;

    public  int getCount(){
        if(count==-1){
            synchronized (objectsCached){
                objects.clear();
                objects.addAll(objectsCached);
                count=objects.size();
                return count;
            }
        }else{
            return count;
        }
    }
    public T getObject(int position){
        return objects.get(position);
    }
    public void addObject(T object){
        synchronized (objectsCached){
            objectsCached.add(object);
            count=-1;
        }
    }
    public void addObjects(List<T> objects){
        synchronized (objectsCached){
            objectsCached.addAll(objects);
            count=-1;
        }
    }
    public void setObjects(List<T> objects){
        synchronized (objectsCached){
            objectsCached.clear();
            objectsCached.addAll(objects);
            count=-1;
        }
    }
    public void removeObject(T object){
        synchronized (objectsCached){
            objectsCached.remove(object);
            count=-1;
        }
    }

}

并发安全的Adapter

标签:

原文地址:http://blog.csdn.net/dzg1977/article/details/44924993

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!