android照片墙的实现

时间:2023-01-18 20:56:14

转载自 http://blog.csdn.net/guolin_blog/article/details/9526203

由于每个android应用程序都有内存限制,所以如果加载很多图片的话,一定会出现OOM异常

这就需要使用LruCache内存缓存技术了,LruCache是在support-v4 jar包中,所以想运用此技术需要把jar包加进去。

LruCache的技术原理就是吧最近使用的对象使用强引用保存在LinkedHashMap中,对那些很少使用的在缓存值达到预定值之前从内存中移除

以前经常使用的软引用 在2.3之后已经不再推荐使用了,因为android的垃圾回收机制更倾向于软引用的回收,使得这种技术不再变得可考

package com.qunzheng.photowalldemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView; import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List; /**
* Created by QunZheng on 2015/5/17.
*/
public class PhotoWallAdapter extends ArrayAdapter implements AbsListView.OnScrollListener {
private static final String TAG = "PhotoWallAdapter";
private GridView mPhotoWall;
//定义内存缓存
private MyLruCache memoryCache;
private List<DownloadBitmapTask> tasks; private int firstVisibleItem;
private int visibleItemCount; private boolean firstLoad = true; public PhotoWallAdapter(Context context, int resource, String[] objects, GridView mPhotoWall) {
super(context, resource, objects); //获取应用程序的最大可用内存,并且分配1/8的内存给memoryCache
long maxMemory = Runtime.getRuntime().maxMemory();
memoryCache = new MyLruCache((int)(maxMemory / 8)); tasks = new ArrayList<>();
this.mPhotoWall = mPhotoWall;
//设置照片的墙的滚动监听事件
this.mPhotoWall.setOnScrollListener(this);
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
String imageUrl = (String) getItem(position);
View view = null;
if (convertView == null) {
view = View.inflate(getContext(), R.layout.griditem_photo_wall, null);
} else {
view = convertView;
}
ImageView imageView = (ImageView) view.findViewById(R.id.photo);
imageView.setTag(imageUrl);
setImageView(imageView,imageUrl); return view;
} private void setImageView(ImageView imageView, String imageUrl) {
Bitmap bitmap = memoryCache.getBitmapFromMemoryCache(imageUrl);
if (bitmap == null) {
imageView.setImageResource(R.drawable.empty_photo);
}else{
imageView.setImageBitmap(bitmap);
}
} private void loadBitmap(int firstVisibleItem, int visibleItemCount) {
for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {
String imageUrl = Images.imageThumbUrls[i]; ImageView imageView = (ImageView) mPhotoWall.findViewWithTag(imageUrl);
Bitmap bitmap = memoryCache.getBitmapFromMemoryCache(imageUrl);
if (bitmap == null) {
//开启后台下载任务
DownloadBitmapTask task = new DownloadBitmapTask();
tasks.add(task);
task.execute(imageUrl); }else {
imageView.setImageBitmap(bitmap);
}
}
} @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.i(TAG, "滚动条的状态发生改变:" + scrollState);
if (scrollState == SCROLL_STATE_IDLE) {
//加载图片
loadBitmap(firstVisibleItem, visibleItemCount);
} else {
cancleTasks();
}
} @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.firstVisibleItem = firstVisibleItem;
this.visibleItemCount = visibleItemCount; if (firstLoad && visibleItemCount > 0) {
loadBitmap(firstVisibleItem,visibleItemCount);
firstLoad = false;
} Log.i(TAG,"firstVisibleItem:" + firstVisibleItem);
Log.i(TAG,"visibleItemCount:" + visibleItemCount);
} /**
*
*/
public void cancleTasks() {
if (tasks != null) {
for (DownloadBitmapTask task : tasks) {
task.cancel(false);
}
}
} /**
* 下载图片的任务
*/
private class DownloadBitmapTask extends AsyncTask<String,Void,Bitmap>{
String imageUrl;
@Override
protected Bitmap doInBackground(String... params) {
imageUrl = params[0];
Bitmap bitmap = downloadBitmap(imageUrl);
Log.i(TAG, bitmap.toString());
if(bitmap != null){
//吧下载的bitmap添加到内存缓存中
memoryCache.addBitmapToMemoryCache(imageUrl,bitmap);
}
return bitmap;
} @Override
protected void onPostExecute(Bitmap bitmap) {
ImageView imageView = (ImageView) mPhotoWall.findViewWithTag(imageUrl);
if (imageView != null && bitmap != null) {
imageView.setImageBitmap(bitmap);
} tasks.remove(this);
} private Bitmap downloadBitmap(String imageUrl) {
HttpURLConnection conn = null;
Bitmap bitmap = null;
try {
URL url = new URL(imageUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setReadTimeout(5 * 1000); // conn.connect();
InputStream in = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(in);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (conn != null) {
conn.disconnect();
}
}
return bitmap;
}
}
}

  

android照片墙的实现的更多相关文章

  1. Android照片墙完整版,的完美结合LruCache和DiskLruCache

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/34093441 在上一篇文章其中,我们学习了DiskLruCache的概念和基本使用 ...

  2. Android照片墙完整版,完美结合LruCache和DiskLruCache

    转载地址:http://blog.csdn.net/guolin_blog/article/details/34093441#comments 在上一篇文章当中,我们学习了DiskLruCache的概 ...

  3. Android照片墙完整版,完美结合 内存方案 LruCache 和 硬盘方案 DiskLruCache

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/34093441 在上一篇文章当中,我们学习了DiskLruCache的概念和基本用法 ...

  4. Android照片墙加强版,使用ViewPager实现画廊效果

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12646775 记得关于照片墙的文章我已经写过好几篇了,有最基本的照片墙,有瀑布流模 ...

  5. Android照片墙应用实现,再多的图片也不怕崩溃

    本文首发于CSDN博客,转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9526203 照片墙这种功能现在应该算是挺常见了,在很多应用 ...

  6. Android照片墙-多图加载

    http://blog.csdn.net/guolin_blog/article/details/9526203 照片墙这种功能现在应该算是挺常见了,在很多应用中你都可以经常看到照片墙的身影.它的设计 ...

  7. Android高效加载大图、多图解决方案,有效避免程序OOM

    高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...

  8. Android缓存学习入门

    本文主要包括以下内容 利用LruCache实现内存缓存 利用DiskLruCache实现磁盘缓存 LruCache与DiskLruCache结合实例 利用了缓存机制的瀑布流实例 内存缓存的实现 pub ...

  9. Android AsyncTask完全解析,带你从源码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11711405 我们都知道,Android UI是线程不安全的,如果想要在子线程里进 ...

随机推荐

  1. jQuery 学习笔记

    jQuery 学习笔记   一.jQuery概述    宗旨: Write Less, Do More.    基础知识:        1.符号$代替document.getElementById( ...

  2. phpcms评论的url替换问题

    在整个项目改ip之前,评论里的url是127.0.1.113 改成localhost之后,更新了所有的url和缓存,但是v9_comment表中的url字段没有更新. 想一下后台只有一个地方是替换数据 ...

  3. Debian GNU&sol;kFreeBSD是什么

    Debian GNU/kFreeBSD 是由使用GNU C语言库的GNU成员组成的基于FreeBSD内核.外加完整的Debian 软件包集合的操作系统. 它来自Debian社区,所以本质上,我们还是应 ...

  4. java三篇博客转载 详解-vector&comma;stack&comma;queue&comma;deque

    博客一:转载自http://shmilyaw-hotmail-com.iteye.com/blog/1825171 java stack的详细实现分析 简介 我们最常用的数据结构之一大概就是stack ...

  5. qTip2 精致的jQuery提示信息插件

    qTip2 精致的jQuery提示信息插件    出处:http://www.cnblogs.com/lwme/archive/2012/02/16/qtip2-jquery-plugin.html ...

  6. SAP 物料移动tcode

    月底,财务月结,需要关账,关闭物料移动功能,支持财务对账: 其中一项任务是要锁定物料移动tcode,这应该是其中部分: CO27 PPIOM000 1000 拣配清单MB1A SAPMM07M 400 ...

  7. Virtualizing WrapPanel VS toolkit&colon;WrapPanel

    用toolkit:WrapPanel的时候,LIST太大,内存不行,等下我试试 Virtualizing WrapPanel这个 http://www.codeproject.com/Articles ...

  8. 项目实战8—tomcat企业级Web应用服务器配置与会话保持

    tomcat企业级Web应用服务器配置与实战 环境背景:公司业务经过长期发展,有了很大突破,已经实现盈利,现公司要求加强技术架构应用功能和安全性以及开始向企业应用.移动APP等领域延伸,此时原来开发w ...

  9. Java开源生鲜电商平台-异常模块的设计与架构&lpar;源码可下载)

    Java开源生鲜电商平台-异常模块的设计与架构(源码可下载) 说明:任何一个软件系统都会出现各式各样的异常与错误,我们需要根据异常的情况进行捕获与分析,改善自己的代码,让其更加的稳定的,快速的运行,那 ...

  10. jenkins-参数化构建&lpar;三&rpar;插件:Git Parameter

    一.下载插件Git Parameter (更加省事) 在配置中branch和tag用的比较多 注意:Credential 可以添加密码,jenkins如果在root用户下载的请改   /etc/sys ...