android 队列模仿listview同步加载图片
来源:互联网 发布:淘宝的淘气值怎么提升 编辑:程序博客网 时间:2024/05/20 16:13
我们今天在listview加载图片都是异步的,如果有个需求要求listview同步加载图片,同步加载图片是什么意思呢?就是第一张图片下载好了,然后接着第二张图片下载,依次类推,今天就简单的模仿写个简单的,而且下载的图片还要缓存到SD卡中
思路:
队列是用LinkedList集合模拟,
缓存:当图片下载成功了把当前图片对应的url经过md5加密存到sd卡中的某个子文件夹下,当用户再次进来的时候,可以adapter中判断这个url是否存在,如果存在就加载这个url对应的图片,就达到了缓存的目的
代码如下:
public class MainActivity extends Activity implements OnItemClickListener,DownLoadSuccess{private ListView lv;private List<String> pics = new ArrayList<String>();private FrameAdapter adapter;private DownLoadUtil downLoadUtil;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv = (ListView) findViewById(R.id.lv);pics.add("http://img3.douban.com/view/photo/albumcover/public/p2214024212.jpg");pics.add("http://img3.douban.com/view/photo/albumcover/public/p2204417742.jpg");pics.add("http://img5.douban.com/view/photo/albumcover/public/p2214440886.jpg");pics.add("http://img3.douban.com/view/photo/albumcover/public/p2200048400.jpg");pics.add("http://img3.douban.com/view/commodity_story/medium/public/p11589841.jpg");pics.add("http://img5.douban.com/view/commodity_story/small/public/p8220077.jpg");pics.add("http://img5.douban.com/view/commodity_story/small/public/p9683297.jpg");pics.add("http://img3.douban.com/view/commodity_story/small/public/p9581674.jpg");pics.add("http://img5.douban.com/view/commodity_story/small/public/p11824477.jpg");adapter = new FrameAdapter();downLoadUtil = new DownLoadUtil(this,adapter);lv.setAdapter(adapter);lv.setOnItemClickListener(this);}public class FrameAdapter extends BaseAdapter {private int position =-1;public void setPosition(int position) {this.position = position;}@Overridepublic int getCount() {pics.size();return (pics==null||pics.isEmpty())?0:pics.size();}@Overridepublic Object getItem(int position) {return pics.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View converView, ViewGroup arg2) {ViewHolder holder;if(converView==null){converView = View.inflate(getApplicationContext(), R.layout.item, null);holder = new ViewHolder();holder.bindView(converView);converView.setTag(holder);}else{holder = (ViewHolder) converView.getTag();}holder.reset(position);return converView;}class ViewHolder{ImageView iv_frame;private View converView;public void bindView(View converView) {this.converView = converView;iv_frame = (ImageView) converView.findViewById(R.id.iv_frame);}public void reset(int position){String url = pics.get(position);String tempPath = MD5Utils.md5(Utils.replaceUrl(url).trim());//final String sdTopPath = String.format("%s%s", CacheFileUtils.getSnapartFramesRootPath(), tempPath);//sd卡路径if(CacheFileUtils.isExists(sdTopPath)){Bitmap bitmap = BitmapFactory.decodeFile(sdTopPath);iv_frame.setImageBitmap(bitmap);}else{//iv_frame.setImageResource(R.drawable.frame_loadingmore);}}}}@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {String url = pics.get(position);if(TextUtils.isEmpty(url)){Toast.makeText(this, "文件不能下载,请检查你的网络", 0).show();return;}String tempPath = MD5Utils.md5(Utils.replaceUrl(url).trim());//final String sdTopPath = String.format("%s%s", CacheFileUtils.getSnapartFramesRootPath(), tempPath);//sd卡路径if(!CacheFileUtils.isExists(sdTopPath)){downLoadUtil.execute(pics.get(position));}else{Toast.makeText(this, "文件已存在", 0).show();}}public Handler handler = new Handler(){public void handleMessage(android.os.Message msg) { if(msg.what==1){ adapter.notifyDataSetChanged(); }}};@Overridepublic void onSuccess() {handler.sendEmptyMessage(1);} }
下载的类:
DownLoadUtil.java
public class DownLoadUtil {private static Context context;public static final String TAG = "DownLoadUtil";Thread thread;private boolean isDownLoadOver = false;private int position;private static DownLoadUtil instance = null;private DownLoadSuccess downLoadSuccess;private FrameAdapter adapter;private Task task;private ExecutorService newSingleThreadExecutor;private LinkedList<String> ll = new LinkedList<String>();private Set<String> strContent = new HashSet<String>();private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what==1){ adapter.notifyDataSetChanged(); isDownLoadOver = false; checkDownLoad(); } }};public void setDownLoadSuccess(DownLoadSuccess downLoadSuccess) {this.downLoadSuccess = downLoadSuccess;}public DownLoadUtil(Context context,FrameAdapter adapter) {this.context = context;this.adapter = adapter;newSingleThreadExecutor = Executors.newSingleThreadExecutor();task = new Task();}public void execute(String url) {if (!ll.contains(url)) {ll.addLast(url);task.setUrl(url);//把task放入download();}}private void destoryDownLoadThread() {if (null != thread && Thread.State.RUNNABLE == thread.getState()) {try {Thread.sleep(500);thread.interrupt();} catch (Exception e) {thread = null;}}thread = null;}public void download() {if (!isDownLoadOver) {isDownLoadOver = true;if(ll.size()>0){String downUrl = ll.getFirst();if(!TextUtils.isEmpty(downUrl)){task.setUrl(downUrl);newSingleThreadExecutor.execute(task);}}}}public void checkDownLoad() {ll.removeFirst();if(!ll.isEmpty()){download();}}public interface DownLoadSuccess{public void onSuccess();}class Task implements Runnable {public String url;public Task() {}public void setUrl(String url) {this.url = url;}public Task(String url) {this.url = url;}@Overridepublic void run() {if (isDownLoadOver) {InputStream inputStream = null;FileOutputStream fos = null;try {URL murl = new URL(url);HttpURLConnection conn = (HttpURLConnection) murl.openConnection();inputStream = conn.getInputStream(); String tempPath = MD5Utils.md5(Utils.replaceUrl(url).trim());// final String sdTopPath = String.format("%s%s", CacheFileUtils.getSnapartFramesRootPath(), tempPath);//sd卡路径File file = new File(sdTopPath);fos = new FileOutputStream(file);byte[] buff = new byte[1024];int len = 0;while ((len = inputStream.read(buff)) != -1) {fos.write(buff, 0, len);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}handler.sendEmptyMessage(1);}} }}}
CacheFileUtils.java 缓存的工具类
public static boolean isExists(String fileName) {if (TextUtils.isEmpty(fileName)) {return false;}File file = new File(fileName);return file.exists();}
/** * * @return */public static String getSnapartFramesRootPath() {String sdcardPath = getSDPath();StringBuffer fileSB = new StringBuffer();fileSB.append(sdcardPath).append(File.separator).append(ConfigManager.APP_FOLDER);fileSB.append(File.separator).append(ConfigManager.CACHE_SNAPART_FRAMES).append(File.separator);// 文件夹问null时构造String rootPath = fileSB.toString();File destDir = new File(rootPath);if (!destDir.exists() || destDir.getAbsoluteFile() == null) {destDir.mkdirs();}return rootPath;}
0 0
- android 队列模仿listview同步加载图片
- Android ListView异步加载图片
- Android ListView异步加载图片
- android ListView 异步加载图片
- Android ListView异步加载图片
- Android ListView异步加载图片
- Android ListView 异步加载图片
- Android ListView异步加载图片
- Android listview 图片异步加载
- Android ListView 异步加载图片
- Android--ListView异步加载图片
- android listview异步加载图片
- Android ListView 异步加载图片
- android listview异步加载图片
- Android ListView异步加载图片
- Android ListView异步加载图片
- Android listview异步加载图片
- Android ListView 异步加载图片
- Activity 中 onSaveInstanceState和onRestoreInstanceState 区别
- 打印出100-999之间的数所有的“水仙花数”。。所谓水仙花数,就是指3位数,其各位数字立方和等于该数本身。
- CAS SERVER 登录部分定制开发
- spring mvc路径匹配原则
- 测试WeakReference和PhantomReference
- android 队列模仿listview同步加载图片
- nodejs 简单爬虫(一)
- TextView设置字体显示个数,超出部分省略号表示, 或者设置显示行数,超出部分按省略号显示
- python实战的博客
- Json转换利器Gson—— List to Json
- 批量删除".svn"文件夹方法
- IOS网络学习-5、GET请求和POST请求
- LINE_TO_STRING
- 线程池(上)