zoukankan      html  css  js  c++  java
  • 安卓图片加载框架--Universal-Image-Loader

      今天来介绍图片加载的框架Android-Universal-Image-Loader

      GITHUB上的下载路径为:https://github.com/nostra13/Android-Universal-Image-Loader

      也可以自行百度下载。

      首先来封装的一个类CacheTool ,由于其他加载图片的方法有点繁琐,所以这里仅封装了一个简单实用的加载方法:

    
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.CompressFormat;
    import android.net.Uri;
    import android.os.Environment;
    import android.widget.ImageView;
    
    import java.io.File;
    
    import com.ncct.app.R;
    import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
    import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
    import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
    import com.nostra13.universalimageloader.core.DisplayImageOptions;
    import com.nostra13.universalimageloader.core.ImageLoader;
    import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
    import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
    import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
    import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
    
    /**
     * 图片加载框架
     * 
     * @author jiang
     * 
     */
    public class CacheTool {
    
        private static File cacheDir = Environment.getDataDirectory();
        private static DisplayImageOptions options = new DisplayImageOptions.Builder().showStubImage(R.drawable.loading_img)
                .showImageForEmptyUri(R.drawable.loading_error).showImageOnFail(R.drawable.loading_error)
                .cacheInMemory(true).cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565).build();
    
        private static ImageLoaderConfiguration config;
    
        public static void Init(Context context) {
            config = new ImageLoaderConfiguration.Builder(context).memoryCacheExtraOptions(480, 800) // max
                                                                                                        // width,
                                                                                                        // max
                                                                                                        // height,即保存的每个缓存文件的最大长宽
                    .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) // Can
                                                                                    // slow
                                                                                    // ImageLoader,
                                                                                    // use
                                                                                    // it
                                                                                    // carefully
                                                                                    // (Better
                                                                                    // don't
                                                                                    // use
                                                                                    // it)/设置缓存的详细信息,最好不要设置这个
                    .threadPoolSize(3)// 线程池内加载的数量
                    .threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory()
                    .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You
                                                                                    // can
                                                                                    // pass
                                                                                    // your
                                                                                    // own
                                                                                    // memory
                                                                                    // cache
                                                                                    // implementation/你可以通过自己的内存缓存实现
                    .memoryCacheSize(2 * 1024 * 1024).discCacheSize(50 * 1024 * 1024)
                    .discCacheFileNameGenerator(new Md5FileNameGenerator())// 将保存的时候的URI名称用MD5
                                                                            // 加密
                    .tasksProcessingOrder(QueueProcessingType.LIFO).discCacheFileCount(100) // 缓存的文件数量
                    // .discCache(new UnlimitedDiscCache(cacheDir))// 自定义缓存路径
                    .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
                    .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout
                                                                                            // (5
                                                                                            // s),
                                                                                            // readTimeout
                                                                                            // (30
                                                                                            // s)超时时间
                    .writeDebugLogs() // Remove for release app
                    .build();// 开始构建
            // Initialize ImageLoader with configuration.
            ImageLoader.getInstance().init(config);
        }
    
        /**
         * 加载图片并监听回调结果
         * 
         * @param iv
         * @param url
         * @param mImageLoadingListener
         */
        public static void displayImg(ImageView iv, String url, ImageLoadingListener mImageLoadingListener) {
            ImageLoader.getInstance().displayImage(url, iv, options, mImageLoadingListener);
        }
    
        /**
         * 加载图片
         * 
         * @param iv
         * @param url
         */
        public static void displayImg(ImageView iv, String url) {
    
            ImageLoader.getInstance().displayImage(url, iv, options);
        }
    
        /**
         * 清除内存
         */
        public static void clearMemoryCache() {
            ImageLoader.getInstance().clearMemoryCache();
        }
    
        /**
         * 清除缓存
         */
        public static void clearDiskCache() {
            ImageLoader.getInstance().clearDiscCache();
        }
    
        /**
         * 得到某个图片的缓存路径
         * 
         * @param imageUrl
         * @return
         */
        public static String getImagePath(String imageUrl) {
            return ImageLoader.getInstance().getDiscCache().get(imageUrl).getPath();
        }
    
    }

      封装好了,里面都有详细的介绍,这里介绍下上面的中的ImageLoadingListener 接口回调,按ctrl + 鼠标左键可以进入jar包里的java文件:

    /*******************************************************************************
     * Copyright 2011-2013 Sergey Tarasevich
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     * http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     *******************************************************************************/
    package com.nostra13.universalimageloader.core.assist;
    
    import android.graphics.Bitmap;
    import android.view.View;
    
    /**
     * Listener for image loading process.<br />
     * You can use {@link SimpleImageLoadingListener} for implementing only needed methods.
     *
     * @author Sergey Tarasevich (nostra13[at]gmail[dot]com)
     * @see SimpleImageLoadingListener
     * @see FailReason
     * @since 1.0.0
     */
    public interface ImageLoadingListener {
    
        /**
         * Is called when image loading task was started
         *
         * @param imageUri Loading image URI
         * @param view     View for image
         */
        void onLoadingStarted(String imageUri, View view);
    
        /**
         * Is called when an error was occurred during image loading
         *
         * @param imageUri   Loading image URI
         * @param view       View for image. Can be <b>null</b>.
         * @param failReason {@linkplain FailReason The reason} why image loading was failed
         */
        void onLoadingFailed(String imageUri, View view, FailReason failReason);
    
        /**
         * Is called when image is loaded successfully (and displayed in View if one was specified)
         *
         * @param imageUri    Loaded image URI
         * @param view        View for image. Can be <b>null</b>.
         * @param loadedImage Bitmap of loaded and decoded image
         */
        void onLoadingComplete(String imageUri, View view, Bitmap loadedImage);
    
        /**
         * Is called when image loading task was cancelled because View for image was reused in newer task
         *
         * @param imageUri Loading image URI
         * @param view     View for image. Can be <b>null</b>.
         */
        void onLoadingCancelled(String imageUri, View view);
    }

      从以上代码中我们可以了解到接口中我们可以监听到开始、失败、完成、取消的动作。

      现在开始使用吧:

        private ImageView My_Head;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.personcenter);
            My_Head = (ImageView) findViewById(R.id.My_Head);
                    String Url = "http://pic.nipic.com/2007-11-09/200711912453162_2.jpg";
                    CacheTool.displayImg(My_Head , Url );
        }     

       Mark一下,暂存一个直接通过URL获取bitmap的函数,未作内存处理。

        /**
         * 获取指定路径的图片
         * 
         * @param urlpath
         * @return
         * @throws Exception
         */
        public Bitmap getImage(String urlpath) throws Exception {
            URL url = new URL(urlpath);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5000);
            Bitmap bitmap = null;
            InputStream inputStream = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);
            return bitmap;
        }
  • 相关阅读:
    Java多线程之Exchanger
    Java8 比AtomicLong更加高效的原子操作LogAdder
    synchronized父子类对象锁重入
    java8 stream多字段排序
    利用java代码给mongo数据库加索引、删除索引等操作
    C++之IO
    C++之类的定义和性质
    C++之动态内存与类型转换
    C++之字符与其他数据类型
    C++之函数与模板
  • 原文地址:https://www.cnblogs.com/lossingdawn/p/4819776.html
Copyright © 2011-2022 走看看