分享

初识ImageLoader---ImageLoader控件部署到本地android项目

 风雪夜归人_95 2015-01-28
       图片显示从来都不是什么新鲜话题。图片显示最大的问题就是内存溢出,这也是让很多人都感到为之头疼的地方。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,所以下面列举了几个可以获取图片的位置,如下图:
 






    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多