zoukankan      html  css  js  c++  java
  • android网络图片加载缓存,避免重复加载。

    1.主线程调用方法:
    imageView = new ImageView(this);
    AsynImageLoader asynImageLoader = new AsynImageLoader();
    asynImageLoader.showImageAsyn(imageView, URL, R.drawable.nopicture);
    mViewList.add(imageView);
    2.AsynImageLoader加载缓存:
        public void showImageAsyn(ImageView imageView, String url, int resId){  
            imageView.setTag(url);  
            Bitmap bitmap = loadImageAsyn(url, getImageCallback(imageView, resId));      
            if(bitmap == null){  
                imageView.setImageResource(resId);  
            }else{  
                imageView.setImageBitmap(bitmap);  
            }  
        }  
    public Bitmap loadImageAsyn(String path, ImageCallback callback){  
            // 判断缓存中是否已经存在该图片  
            if(caches.containsKey(path)){  
                // 取出软引用  
                SoftReference<Bitmap> rf = caches.get(path);  
                // 通过软引用,获取图片  
                Bitmap bitmap = rf.get();  
                // 如果该图片已经被释放,则将该path对应的键从Map中移除掉  
                if(bitmap == null){  
                    caches.remove(path);  
                }else{  
                    // 如果图片未被释放,直接返回该图片  
                    Log.i(TAG, "return image in cache" + path);  
                    return bitmap;  
                }  
            }else{  
                // 如果缓存中不常在该图片,则创建图片下载任务  
                Task task = new Task();  
                task.path = path;  
                task.callback = callback;  
                Log.i(TAG, "new Task ," + path);  
                if(!taskQueue.contains(task)){  
                    taskQueue.add(task);  
                    // 唤醒任务下载队列  
                    synchronized (runnable) {  
                        runnable.notify();  
                    }  
                }  
            }        
            // 缓存中没有图片则返回null  
            return null;  
        }  
    private ImageCallback getImageCallback(final ImageView imageView, final int resId){  
            return new ImageCallback() {      
                @Override  
                public void loadImage(String path, Bitmap bitmap) {  
                    if(path.equals(imageView.getTag().toString())){  
                        imageView.setImageBitmap(bitmap);  
                    }else{  
                        imageView.setImageResource(resId);  
                    }  
                }  
            };  
        }     
        private Handler handler = new Handler(){  
            @Override  
            public void handleMessage(Message msg) {  
                // 子线程中返回的下载完成的任务  
                Task task = (Task)msg.obj;  
                // 调用callback对象的loadImage方法,并将图片路径和图片回传给adapter  
                task.callback.loadImage(task.path, task.bitmap);  
            }  
             
        };  
        private Runnable runnable = new Runnable() {      
            @Override  
            public void run() {  
                while(isRunning){  
                    // 当队列中还有未处理的任务时,执行下载任务  
                    while(taskQueue.size() > 0){  
                        // 获取第一个任务,并将之从任务队列中删除  
                        Task task = taskQueue.remove(0);  
                        // 将下载的图片添加到缓存  
                        task.bitmap = PicUtil.getbitmap(task.path);  
                        caches.put(task.path, new SoftReference<Bitmap>(task.bitmap));  
                        if(handler != null){  
                            // 创建消息对象,并将完成的任务添加到消息对象中  
                            Message msg = handler.obtainMessage();  
                            msg.obj = task;  
                            // 发送消息回主线程  
                            handler.sendMessage(msg);  
                        }  
                    }               
                    //如果队列为空,则令线程等待  
                    synchronized (this) {  
                        try {  
                            this.wait();  
                        } catch (InterruptedException e) {  
                            e.printStackTrace();  
                        }  
                    }  
                }  
            }  
        };  
        //回调接口  
        public interface ImageCallback{  
            void loadImage(String path, Bitmap bitmap);  
        }   
        class Task{  
            // 下载任务的下载路径  
            String path;  
            // 下载的图片  
            Bitmap bitmap;  
            // 回调对象  
            ImageCallback callback;  
            @Override  
            public boolean equals(Object o) {  
                Task task = (Task)o;  
                return task.path.equals(path);  
            }  
        }
    3.获取网络图片:
    /**
             * 根据一个网络连接(URL)获取bitmapDrawable图像
             *
             * @param imageUri
             * @return
             */
            public static BitmapDrawable getfriendicon(URL imageUri) {

                    BitmapDrawable icon = null;
                    try {
                            HttpURLConnection hp = (HttpURLConnection) imageUri
                                            .openConnection();
                            icon = new BitmapDrawable(hp.getInputStream());// 将输入流转换成bitmap
                            hp.disconnect();// 关闭连接
                    } catch (Exception e) {
                    }
                    return icon;
            }
            /**
             * 根据一个网络连接(String)获取bitmapDrawable图像
             *
             * @param imageUri
             * @return
             */
            public static BitmapDrawable getcontentPic(String imageUri) {
                    URL imgUrl = null;
                    try {
                            imgUrl = new URL(imageUri);
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
                    BitmapDrawable icon = null;
                    try {
                            HttpURLConnection hp = (HttpURLConnection) imgUrl.openConnection();
                            icon = new BitmapDrawable(hp.getInputStream());// 将输入流转换成bitmap
                            hp.disconnect();// 关闭连接
                    } catch (Exception e) {
                    }
                    return icon;
            }
            /**
             * 根据一个网络连接(URL)获取bitmap图像
             *
             * @param imageUri
             * @return
             */
            public static Bitmap getusericon(URL imageUri) {
                    // 显示网络上的图片
                    URL myFileUrl = imageUri;
                    Bitmap bitmap = null;
                    try {
                            HttpURLConnection conn = (HttpURLConnection) myFileUrl
                                            .openConnection();
                            conn.setDoInput(true);
                            conn.connect();
                            InputStream is = conn.getInputStream();
                            bitmap = BitmapFactory.decodeStream(is);
                            is.close();
                    } catch (IOException e) {
                            e.printStackTrace();
                    }
                    return bitmap;
            }
            /**
             * 根据一个网络连接(String)获取bitmap图像
             *
             * @param imageUri
             * @return
             * @throws MalformedURLException
             */
            public static Bitmap getbitmap(String imageUri) {
                    // 显示网络上的图片
                    Bitmap bitmap = null;
                    try {
                            URL myFileUrl = new URL(imageUri);
                            HttpURLConnection conn = (HttpURLConnection) myFileUrl
                                            .openConnection();
                            conn.setDoInput(true);
                            conn.connect();
                            InputStream is = conn.getInputStream();
                            bitmap = BitmapFactory.decodeStream(is);
                            is.close();
                    } catch (IOException e) {
                            e.printStackTrace();
                            return null;
                    }
                    return bitmap;
            }
            /**
             * 下载图片 同时写道本地缓存文件中
             *
             * @param context
             * @param imageUri
             * @return
             * @throws MalformedURLException
             */
            public static Bitmap getbitmapAndwrite(String imageUri) {
                    Bitmap bitmap = null;
                    try {
                            // 显示网络上的图片
                            URL myFileUrl = new URL(imageUri);
                            HttpURLConnection conn = (HttpURLConnection) myFileUrl
                                            .openConnection();
                    conn.setDoInput(true);
                            conn.connect();
                            InputStream is = conn.getInputStream();
                            File cacheFile = FileUtil.getCacheFile(imageUri);
                            BufferedOutputStream bos = null;
                            bos = new BufferedOutputStream(new FileOutputStream(cacheFile));
                            byte[] buf = new byte[1024];
                            int len = 0;
                            // 将网络上的图片存储到本地
                            while ((len = is.read(buf)) > 0) {
                                    bos.write(buf, 0, len);
                            }
                            is.close();
                            bos.close();
                            // 从本地加载图片
                            bitmap = BitmapFactory.decodeFile(cacheFile.getCanonicalPath());
                    } catch (IOException e) {
                            e.printStackTrace();
                    }
                    return bitmap;
            }
            public static boolean downpic(String picName, Bitmap bitmap) {
                    boolean nowbol = false;
                    try {
                            File saveFile = new File("/mnt/sdcard/download/weibopic/" + picName
                                            + ".png");
                            if (!saveFile.exists()) {
                                    saveFile.createNewFile();
                            }
                            FileOutputStream saveFileOutputStream;
                            saveFileOutputStream = new FileOutputStream(saveFile);
                            nowbol = bitmap.compress(Bitmap.CompressFormat.PNG, 100,
                                            saveFileOutputStream);
                            saveFileOutputStream.close();
                    } catch (FileNotFoundException e) {
                            e.printStackTrace();
                    } catch (IOException e) {
                            e.printStackTrace();
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
                    return nowbol;
            }

            public static void writeTofiles(Context context, Bitmap bitmap,
                            String filename) {
                    BufferedOutputStream outputStream = null;
                    try {
                            outputStream = new BufferedOutputStream(context.openFileOutput(
                                            filename, Context.MODE_PRIVATE));
                            bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
                    } catch (FileNotFoundException e) {
                            e.printStackTrace();
                    }
            }
            /**
             * 将文件写入缓存系统中
             *
             * @param filename
             * @param is
             * @return
             */
            public static String writefile(Context context, String filename,
                            InputStream is) {
                    BufferedInputStream inputStream = null;
                    BufferedOutputStream outputStream = null;
                    try {
                            inputStream = new BufferedInputStream(is);
                            outputStream = new BufferedOutputStream(context.openFileOutput(
                                            filename, Context.MODE_PRIVATE));
                            byte[] buffer = new byte[1024];
                            int length;
                            while ((length = inputStream.read(buffer)) != -1) {
                                    outputStream.write(buffer, 0, length);
                            }
                    } catch (Exception e) {
                    } finally {
                            if (inputStream != null) {
                                    try {
                                            inputStream.close();
                                    } catch (IOException e) {
                                            e.printStackTrace();
                                    }
                            }
                            if (outputStream != null) {
                                    try {
                                            outputStream.flush();
                                            outputStream.close();
                                    } catch (IOException e) {
                                            e.printStackTrace();
                                    }
                            }
                    }
                    return context.getFilesDir() + "/" + filename + ".jpg";
            }
            // 放大缩小图片
            public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
                    int width = bitmap.getWidth();
                    int height = bitmap.getHeight();
                    Matrix matrix = new Matrix();
                    float scaleWidht = ((float) w / width);
                    float scaleHeight = ((float) h / height);
                    matrix.postScale(scaleWidht, scaleHeight);
                    Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height,
                                    matrix, true);
                    return newbmp;
            }
            // 将Drawable转化为Bitmap
            public static Bitmap drawableToBitmap(Drawable drawable) {
                    int width = drawable.getIntrinsicWidth();
                    int height = drawable.getIntrinsicHeight();
                    Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
                                    .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                                    : Bitmap.Config.RGB_565);
                    Canvas canvas = new Canvas(bitmap);
                    drawable.setBounds(0, 0, width, height);
                    drawable.draw(canvas);
                    return bitmap;
            }
            // 获得圆角图片的方法
            public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
                    if (bitmap == null) {
                            return null;
                    }
                    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                                    bitmap.getHeight(), Config.ARGB_8888);
                    Canvas canvas = new Canvas(output);
                    final int color = 0xff424242;
                    final Paint paint = new Paint();
                    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
                    final RectF rectF = new RectF(rect);
                    paint.setAntiAlias(true);
                    canvas.drawARGB(0, 0, 0, 0);
                    paint.setColor(color);
                    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
                    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
                    canvas.drawBitmap(bitmap, rect, rect, paint);
                    return output;
            }
            // 获得带倒影的图片方法
            public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
                    final int reflectionGap = 4;
                    int width = bitmap.getWidth();
                    int height = bitmap.getHeight();
                    Matrix matrix = new Matrix();
                    matrix.preScale(1, -1);
                    Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2,
                                    width, height / 2, matrix, false);
                    Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                                    (height + height / 2), Config.ARGB_8888);
                    Canvas canvas = new Canvas(bitmapWithReflection);
                    canvas.drawBitmap(bitmap, 0, 0, null);
                    Paint deafalutPaint = new Paint();
                    canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);
                    canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
                    Paint paint = new Paint();
                    LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
                                    bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
                                    0x00ffffff, TileMode.CLAMP);
                    paint.setShader(shader);
                    // Set the Transfer mode to be porter duff and destination in
                    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
                    // Draw a rectangle using the paint with our linear gradient
                    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
                                    + reflectionGap, paint);
                    return bitmapWithReflection;
            }  
    4.图片加载到本地指定文件夹:
    public static File getCacheFile(String imageUri){  
            File cacheFile = null;  
            try {  
                if (Environment.getExternalStorageState().equals(  
                        Environment.MEDIA_MOUNTED)) {  
                    File sdCardDir = Environment.getExternalStorageDirectory();  
                    String fileName = getFileName(imageUri);  
                    File dir = new File(sdCardDir.getCanonicalPath()  
                            + "file:///android_asset/");  
                    if (!dir.exists()) {  
                        dir.mkdirs();  
                    }  
                    cacheFile = new File(dir, fileName);  
                    Log.i(TAG, "exists:" + cacheFile.exists() + ",dir:" + dir + ",file:" + fileName);  
                }   
            } catch (IOException e) {  
                e.printStackTrace();  
                Log.e(TAG, "getCacheFileError:" + e.getMessage());  
            }           
            return cacheFile;  
        }   
        public static String getFileName(String path) {  
            int index = path.lastIndexOf("/");  
            return path.substring(index + 1);  
        }

  • 相关阅读:
    jQuery.hover() 函数详解
    深入了解css的行高Line Height属性
    yii2 restfulapi QueryParamAuth验证
    yii2 restfulapi 的配置和访问
    yii2 urlmanager的配置
    xubuntu install nodejs
    使用Putty连接VirtualBox的Ubuntu
    mvc与mvvm
    对二叉树进行广度优先遍历
    JavaScript 中的 FileReader
  • 原文地址:https://www.cnblogs.com/devilthrone/p/4249311.html
Copyright © 2011-2022 走看看