打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
初识ImageLoader---ImageLoader控件部署到本地android项目
图片显示从来都不是什么新鲜话题。图片显示最大的问题就是内存溢出,这也是让很多人都感到为之头疼的地方。ImageLoader作为一个开源工程,据说可以很好的解决这个问题。于是,笔者从网上下载到其源码,部署到本地android项目中。网上关于ImageLoader的描述很多,本文并不打算深入剖析ImageLoader的内部原理,仅仅记录ImageLoader使用过程中遇到的一些问题。
步骤一:将下载好的源码引入到本地Eclipse环境中。
由于对这块不熟悉,所以刚开始将解压后的的文件随便放在了一个目录下(并没有和本地android项目放在同一个目录下),导致不能正常引入工程。后来将解压后的源码整个放在和本地android项目相同的目录下,才能正常引入工程。这是因为下载的源码实际上是由两个部分组成:一个是你需要的库,一个是一个制作好的demo。引入工程的时候,不必深入到文件里面,直接引入解压后的整个文件夹,则会出现下面的现象:
上面的library实际上就是我们需要部署到本地android程序的库文件,而下面的sample则是一个自带的demo例程。所以,这里只需要勾选上面的library即可。(笔者之前的一个项目中也有一个library,但忘了删除,所以这一步总是不能引入library,所以在引入之前一定要检查本地Eclipse开发环境是否存在一个同名的库文件)
这个库文件已经配置好,没有太大问题,唯一的问题可能就是android SDK的版本号了。库文件中要求的android-21,笔者本地只有19,修改AndroidManifest.xml文件即可。
步骤2:配置本地Android项目
右键你自己项目,依次点击 属性—>android—>add library,选择imageLoader的library,就配置好了。如图:
这样就完成了整个导入工作。
步骤3:自定义一个继承Application类的类
在这个类中完成ImageLoader的初始化工作。可以采用默认的配置信息或者自定义一个配置信息来初始化Imageloader。
public class myApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
//创建默认的ImageLoader配置参数
ImageLoaderConfiguration config = ImageLoaderConfiguration.createDefault(this);
/*
//自定义ImageLoader配置参数
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.diskCacheSize(50 * 1024 * 1024) // 50 Mb
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs() // Remove for release app
.build();
*/
//Init ImageLoader with configuration
ImageLoader.getInstance().init(config);
}
}
在AndroidManifest.xml文件中也要做相应的修改。在application部分要加上自己定义的这个类的名字:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".myApplication" //需要添加或修改的地方
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light" >
<activity>
.......
< /activity>
</application>
步骤4:下面就可以自由使用Imageloader
对于这部分就需要提到上面的sample了。这个sample非常详细针对ListView ,Gallery,GridView和Viewpager大量使用图片,做了使用示例。可以对照着这些例子来写。这里就不再赘述。
注意:
图片的获取方式有2种:网络获取和本地获取。例子中采用的是网络获取,且图片的个数时固定的。(笔者试验中就没成功获取到这些图片过,可能是因为这些图片是在Google服务器上的原因吧)网络的获取涉及到开辟子线程和线程池的概念。而本地应用又分为读取sdcard上所有的图片和指定路径的图片。这里把2种方式都列举出来:
1)获取sdcard上所有图片
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = { MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATA, MediaStore.Images.Media.SIZE };
String selection = MediaStore.Images.Media.MIME_TYPE + "=?";
String[] selectionArg = { "image/jpeg" };
Cursor mCursor = this.managedQuery(uri, projection, selection,
selectionArg, MediaStore.Images.Media.DATE_MODIFIED + " desc");
imageList.clear();
if (mCursor != null) {
mCursor.moveToFirst();
while (mCursor.getPosition() != mCursor.getCount()) {
imageMap = new HashMap<String, String>();
imageMap.put(imageID, mCursor.getString(mCursor
.getColumnIndex(MediaStore.Images.Media._ID)));
imageMap.put(imageName, mCursor.getString(mCursor
.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME)));
imageMap.put(
imageInfo,
" "
+ (mCursor.getLong(mCursor
.getColumnIndex(MediaStore.Images.Media.SIZE)) / 1024)
+ "KB");
imageList.add(imageMap);
fileNames.add(mCursor.getString(mCursor
.getColumnIndex(MediaStore.Images.Media.DATA)));
mCursor.moveToNext();
}
mCursor.close();
}
2)获取指定路径下所有图片
private String[] getImgPahtList() {
ArrayList<String> list = new ArrayList<String>();
File file = new File(Constant.picPath);
File[] alfiles = file.listFiles();//返回该目录下所有文件
if(alfiles == null) {
return null;
}
for(int i=0;i<alfiles.length;i++) {
File fi = alfiles[i];
if(fi.isFile()) { //是否为一个文件
int idx = fi.getPath().lastIndexOf(".");
if(idx <= 0) {
continue;
}
String suffix = fi.getPath().substring(idx);
if(suffix.toLowerCase().equals(".jpg") ||
suffix.toLowerCase().equals(".jpeg") ||
suffix.toLowerCase().equals(".bmp") ||
suffix.toLowerCase().equals(".png") ||
suffix.toLowerCase().equals(".gif")) {
list.add(fi.getPath());
Log.i(TAG, "图片路径:"+fi.getPath());
}
}
}
int length = list.size();
String[] result = new String[length];
Log.i(TAG, "图片容器个数:"+result.length);
for(int i=0;i<length;i++) {
result[i] = "file://" + list.get(i);//必须添加这个
}
return result;
}
因为最后是将图片的URL值传给Imageloader,所以下面列举了几个可以获取图片的位置,如下图:
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android10填坑适配指南,实际经验代码,拒绝翻译
Android 快传 文件互传
Android
Android读取Mp3音乐文件的方法
Android Content Provider详解
Android实例剖析笔记(四)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服