android 加载本地图片
### Android加载本地图片知识点 #### 一、使用LRUCache加载本地图片的原理与实践 在Android开发过程中,为了防止因加载大量图片而导致应用程序出现内存溢出(OutOfMemoryError),通常会采用LRUCache(Least Recently Used Cache)来管理图片缓存。这种方式能够有效地减少内存消耗,提高应用性能。 **LRUCache**是一种缓存机制,它基于“最近最少使用的策略”进行工作。当缓存空间达到预设上限时,系统会自动移除最久未被访问的数据项。 #### 二、代码解析 1. **主类MainActivity:** - **作用:**该类主要负责初始化GridView,并设置其适配器。 - **关键代码:** ```java mGridViewAdapter = new GridViewAdapter(this, 0, ImagesPath.IMAGES_PATH, mGridView); mGridView.setAdapter(mGridViewAdapter); ``` 2. **GridViewAdapter类详解:** - **类结构:** - **成员变量:** - `private Context context`: 上下文对象,用于获取资源等。 - `private int layoutResourceId`: GridView项布局资源ID。 - `private String[] data`: 图片路径数组。 - `private ImageLoader imageLoader`: 图片加载器,使用LRUCache实现。 - **构造方法:** - `public GridViewAdapter(Context context, int layoutResourceId, String[] data, GridView gridView)`: 初始化GridViewAdapter,传入上下文、布局资源ID、图片路径数组及GridView对象。 - **内部类ViewHolder:** - **作用:**用于存储ImageView,避免每次创建ViewHolder时都重新查找View。 - **成员变量:** - `ImageView imageView`: ImageView对象。 - **重写方法:** - `public View getView(int position, View convertView, ViewGroup parent)`: 用于填充GridView中的每一项。 - 内部调用`imageLoader.DisplayImage(data[position], imageView);`加载并显示图片。 - **其他方法:** - `imageLoader.loadBitmaps(firstVisibleItem, visibleItemCount);`: 负责根据GridView的可见状态加载图片到LRUCache中。 3. **ImageLoader类详解:** - **作用:**负责加载图片并缓存至LRUCache。 - **成员变量:** - `private LruCache<String, Bitmap> mMemoryCache`: LRUCache实例,用于缓存图片。 - **构造方法:** - `public ImageLoader()`: 初始化LRUCache,设置最大容量。 - **关键方法:** - `public void DisplayImage(String url, ImageView imageView)`: 根据URL加载图片到ImageView中。 - 首先尝试从LRUCache中获取图片。 - 如果没有找到,则异步从文件系统加载图片,并将其添加到LRUCache。 - `public void loadBitmaps(int firstVisibleItem, int visibleItemCount)`: 根据GridView的可见状态加载图片。 - 遍历可见的图片索引,逐个加载到LRUCache中。 #### 三、LRUCache实现原理 1. **初始化LRUCache:** - 在ImageLoader构造函数中初始化LRUCache,根据设备可用内存设置最大容量。 - ```java int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); int cacheSize = maxMemory / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getRowBytes() * bitmap.getHeight() / 1024; } }; ``` 2. **缓存逻辑:** - `DisplayImage`方法中,首先尝试从LRUCache中获取图片。 - 如果没有找到,则异步从文件系统加载图片,并将其添加到LRUCache。 - 当缓存达到最大容量时,LRUCache将自动移除最久未被访问的数据项。 #### 四、注意事项 - **内存优化:** - 为防止内存泄漏,确保在Activity销毁时释放LRUCache中的资源。 - **图片尺寸调整:** - 为了进一步节省内存,可以考虑在加载图片时进行尺寸调整,避免加载过大的图片。 - **异常处理:** - 在加载图片时需要考虑到可能发生的各种异常情况,如文件不存在、读取错误等。 通过以上分析,我们可以了解到使用LRUCache加载本地图片的基本原理和具体实现方式,这对于开发高质量的Android应用程序至关重要。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import android.os.Bundle;
import android.widget.GridView;
import android.app.Activity;
/**
* Demo描述:
* Android利用LruCache为GridView加载大量本地图片完整示例,防止OOM
*
* 更多参考:
* http://blog.csdn.net/lfdfhl
*/
public class MainActivity extends Activity {
private GridView mGridView;
private GridViewAdapter mGridViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
mGridView = (GridView) findViewById(R.id.gridView);
mGridViewAdapter = new GridViewAdapter(this, 0, ImagesPath.IMAGES_PATH, mGridView);
mGridView.setAdapter(mGridViewAdapter);
}
}
剩余16页未读,继续阅读
- 粉丝: 1
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
- 3
前往页