android的开发中会遇到这么一种需求,就是把图片存储到本地,每次加载的时候通过保存的图片的名称加载图片,或者利用请求到的/存储数据库存储的名称去加载图片 。
开始我把数据放在了assets中,开始我发现这种方法对于一张两张的图片就无所谓但是图片一多就会出现明显的卡顿,检查发现因为每次 mAssetManager.open().这个方法返回的是inputstream 是个流然后把流用 BitmapFactory.decodeStream()转化成Bitmap的形式。
对此 总结了两种方式 。
第一种方案:
把所需要加载的文件放入raw文件夹中 然后getIdentifier()方法获取图片的ID
//第一个参数文件名称(不加后缀), 第二个参数文件夹名称,第三个参数包名
public int getImageID(String name) {
int id = mContext.getResources().getIdentifier(name, "raw",
mContext.getPackageName());
return id;
}
如果说文件是在Drawable中呢 ?那么我们使用的时候只需要改下文件夹既可以了
//第一个参数文件名称(不加后缀), 第二个参数文件夹名称,第三个参数包名
public int getImageID(String name) {
int id = mContext.getResources().getIdentifier(name, "drawable",
mContext.getPackageName());
return id;
}
第二种方案:
相对于第一种的方法第二种方案有点复杂而且性能有所降低,利用反射等原理。
1、首先呢我们要把文件所放的目录整体的遍历一遍 存储到Map中
map中存放的是图片的名称和ID
2、使用的时候根据文件夹下的KEY(图片名称)获取对应的id然后利用 openRawResource()方法加载图片
public Map<String, Integer> getRawImage(){
Map<String, Integer> map = new HashMap<String, Integer>();
Field[] fields = R.raw.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
try {
map.put(fields[i].getName(), fields[i].getInt(R.raw.class));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
fields = null;
return map;
} ;
如果是drawable下的图片呢 ? 同理也是一样
public Map<String, Integer> getDrawableImage(){
Map<String, Integer> map = new HashMap<String, Integer>();
Field[] fields = R.drawable.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
try {
map.put(fields[i].getName(), fields[i].getInt(R.drawable.class));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
fields = null;
return map;
} ;
可以下载demo体验下
下载地址 : http://download.youkuaiyun.com/detail/u012153184/9673268