package com.jiuqi.mobile.nigo.comeclose.bean; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.gson.annotations.Expose; import com.google.gson.internal.$Gson$Types; import com.jiuqi.mobile.nigo.comeclose.exception.IndexOutException; import com.jiuqi.mobile.nigo.comeclose.manager.ILoadDataHandler; /** * 返回结果集封装,此类包含数据请求。不利于用户远程使用。<br/> * 客户端访问时,请谨慎使用。。。使用前请于本人沟通<br/> * 客户端使用方法:<br/> * void handler(){<br/> * String session = "";<br/> * INewsManager manager = ManagerFactory.instanceManager(INewsManager.class, * session );<br/> * int pageSize = 15;<br/> * long startIndex = 0;<br/> * SelectNewsKey key = new SelectNewsKey(pageSize);<br/> * key.setStartIndex(startIndex);<br/> * iterateList(manager, pageSize, startIndex, key);<br/> * //第二次请求<br/> * startIndex += pageSize;<br/> * key.setStartIndex(startIndex);<br/> * iterateList(manager, pageSize, startIndex, key);<br/> * ...<br/> * }<br/> * private void iterateList(INewsManager manager, int pageSize,<br/> * long startIndex, SelectNewsKey key) {<br/> * LoadOnGetList<CarTaskNewsBean> list = manager.get(CarTaskNewsBean.class, * key);<br/> * for(long i=startIndex; i<Math.min(pageSize+startIndex, * list.getTotalCount());i++){<br/> * CarTaskNewsBean bean = list.get(startIndex);<br/> * }<br/> * }<br/> * * @author modi * * @param <T> */ public class LoadOnGetList<T> { @Expose(deserialize = false, serialize = false) private ILoadDataHandler<T> loadData; private int size; // private final SelectKey key; private List<T> list = new ArrayList<T>(); private Map<Long, T> map= new HashMap<Long,T>(); private long startIndex; private long totalCount; public LoadOnGetList() { } public LoadOnGetList(List<T> list) { this.list = list; this.totalCount = list.size(); this.startIndex = list.size(); this.size = list.size(); } public LoadOnGetList(ILoadDataHandler<T> loadData, SelectKey key) { this.size = key.getSize(); this.loadData = loadData; this.startIndex = key.getStartIndex()<0?0:key.getStartIndex(); setTotalCount(initTotalCount()); list = loadData.getData(startIndex,size); } public T get(long index) throws IndexOutException { if(list!=null&&list.size()==0){//第一次初始化 list = loadData.getData(startIndex, size); } if(list!=null&&list.size()==totalCount){//将集合转化为loadongetlist使用 不是分页!使用的是第一个构造函数 return list.get((int)index); }else{ if(list!=null&&list.size()!=0){ long startTemp = startIndex; if(!map.containsKey(startTemp)){//初始化map从stratindex 到size 的条数 for(int i=0;i<list.size();i++){ synchronized (map) { map.put(startTemp++, list.get(i)); } } }else{//取得是 startindex到size意外的条数 比如 取0-15条记录 但是get(16)放入map startTemp = index; for(int i=0;i<list.size();i++){ synchronized (map) { map.put(startTemp++, list.get(i)); } } } } list = null; if(!map.containsKey(index)){//取得是 startindex到size意外的条数 比如 取0-15条记录 但是get(16)重新再数据库取 list = loadData.getData(index, size); return get(index); }else{ return map.get(index); } } } private long initTotalCount(){ return loadData.getTotalCount(); } public long getTotalCount() { return totalCount; } public void setTotalCount(long totalCount) { this.totalCount = totalCount; } /** * 服务端禁用,仅限android客户端使用 * 只允许查询范围之内的 * @return */ public List<T> getList() { // list = loadData.getData(startIndex, size); return list; } public Type getType() { Type superclass = getClass().getGenericSuperclass(); if (superclass instanceof Class) { throw new RuntimeException("Missing type parameter."); } ParameterizedType parameterized = (ParameterizedType) superclass; return $Gson$Types .canonicalize(parameterized.getActualTypeArguments()[0]); } }