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

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,958评论 18 399
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 6,233评论 0 3
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,352评论 0 33
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,602评论 0 11
  • 不知道你有没有注意过自己的硬盘越来越满,下载的好多书,干货都没有认真看过,只是为了收集而收集,还给自己找个合理的理...
    天涯落花零阅读 1,014评论 0 0