• listview异步加载sd卡图片


    package com.example.gridview;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.ref.SoftReference;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.HashMap;
    
    import android.annotation.SuppressLint;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.ImageView;
    
    
    @SuppressLint("HandlerLeak")
    public class AsyncBitmapLoader{
    
            /**
             * 内存图片软引用缓
             */
            @SuppressWarnings("rawtypes")
            private final HashMap<String, SoftReference> imageCache = new HashMap<String, SoftReference>();
    
            @SuppressWarnings("rawtypes")
            public Bitmap loadBitmap(final ImageView imageView, final String imageURL, final ImageCallBack imageCallBack){
    
                    SoftReference reference = imageCache.get(imageURL);
    
                    //在内存缓存中,则返回Bitmap对象
                    if (null != reference && null != reference.get()) {
                            return (Bitmap) reference.get();
                    } else {
    
                            if (null != reference) {
                                    imageCache.remove(reference);
                            }
                            // 加上一个对本地缓存的查找
                            String bitmapName = toTransverseLine(imageURL.substring(imageURL.indexOf("//") + 2));
    
                            File cacheDir = new File("/mnt/sdcard/text/");
                            File[] cacheFiles = cacheDir.listFiles();
                            int i = 0;
    
                            if (null != cacheFiles) {
                                    for (i = 0; i < cacheFiles.length;i++ ){
                                            if (bitmapName.equals(cacheFiles[i].getName())) {
                                                    break;
                                            }
                                    }
    
                                    if (i < cacheFiles.length) {
                                            return BitmapFactory.decodeFile("/mnt/sdcard/text/" + bitmapName); 
                                    }
    
                            }
    
                    }
    
                    final Handler handler = new Handler(){
                            public void handleMessage(Message msg){
                                    imageCallBack.imageLoad(imageView, (Bitmap)msg.obj);
                            }
                    };
    
                    //如果不在内存缓存中,也不在本地(被jvm回收掉),则开启线程下载图片
                    new Thread(){
                            public void run(){
                                    InputStream bitmapIs = getStreamFromURL(imageURL);
                                    Bitmap bitmap = BitmapFactory.decodeStream(bitmapIs);
    
                                    if (bitmap == null ) {
                                            return ;
                                    }
    
                                    imageCache.put(imageURL, new SoftReference(bitmap));
                                    Message msg = handler.obtainMessage(0, bitmap);
                                    handler.sendMessage(msg);
    
                                    File dir = new File("/mnt/sdcard/text/");
    
                                    if (!dir.exists()) {
                                            dir.mkdirs();
                                    }
    
                                    // 下载图片保存到指定路径
                                    String path = "/mnt/sdcard/text/" +
                                                    toTransverseLine(imageURL.substring(imageURL.indexOf("//") + 2));
    
                                    String path1 = "/mnt/sdcard/image/";
    
                                    File bitmapFile = new File(path);
                                    FileOutputStream fos = null;
    
                                    if (!bitmapFile.exists()) {
                                            try{
                                                    bitmapFile.createNewFile();
                                                    fos = new FileOutputStream(bitmapFile);
                                                    bitmap.compress(Bitmap.CompressFormat.PNG,100, fos);
                                            }catch (IOException e) {
                                                    e.printStackTrace();
                                            }finally {
                                                    try {
                                                            if (fos != null) {
                                                                    fos.close();
                                                            }
    
                                                    } catch (IOException e) {
                                                            e.printStackTrace();
                                                    }
                                            }
                                    }
                            }
                    }.start();
    
                    return null;
            }
    
            /**
             * 转换名称保存
             * @param url
             * @return
             */
            private String toTransverseLine(String url) {
                    String name1 = url.replaceAll("/", "_");
                    String name2 = name1.replaceAll("\.", "_");
                    String name3 = name2.replaceAll("\:", "_");
                    return name3;
            }
    
            public interface ImageCallBack{
                    public void imageLoad(ImageView imageView, Bitmap bitmap);
            }
            
            
            /**
             * 通过url请求图片
             * @return
             */
            public static InputStream getStreamFromURL(String imageURL) { 
                    InputStream in=null;
                    try {
                            if (imageURL != null && !imageURL.equals("")) {
                                    URL url=new URL(imageURL); 
                                    HttpURLConnection connection=(HttpURLConnection) url.openConnection();   
                                    in=connection.getInputStream();
                            }
                    } catch (Exception e) {
                            e.printStackTrace(); 
                    } 
                    return in;
            }
    
            
            // =======================下边是调用 写在activity中========================
            private String mNewsPicUrl;        // 新闻图片的url
            private AsyncBitmapLoader asyncBitmapLoader;        // 异步加载
            private ImageView mHeadImage;
            
            /**
             * 显示图片
             * 
             */
            private void showImage() {
    
                    if (mNewsPicUrl != null && !mNewsPicUrl.equals("")) {
                            Bitmap bitmap = asyncBitmapLoader.loadBitmap(mHeadImage, mNewsPicUrl, new ImageCallBack() {
                                    public void imageLoad(ImageView imageView, Bitmap bitmap) {
                                            imageView.setImageBitmap(bitmap);
                                    }
                            });
    
                            if (bitmap != null) {
                                    mHeadImage.setImageBitmap(bitmap);
                            }else {
                                    //                                mHeadImage.setVisibility(View.GONE);
                            }
                    }else {
                            mHeadImage.setVisibility(View.GONE);
                    }
            }
            
    }  
  • 相关阅读:
    330. Patching Array--Avota
    334. Increasing Triplet Subsequence My Submissions Question--Avota
    C++前置++与后置++的区别与重载
    OpenGL光源位置
    深度探索va_start、va_arg、va_end
    C++类型转换
    2019-2020-2 20175216 《网络对抗技术》Exp9 Web安全基础
    2019-2020-2 20175216 《网络对抗技术》Exp8 Web基础
    2019-2020-2 20175216 《网络对抗技术》Exp7 网络欺诈防范
    2019-2020-2 20175216 《网络对抗技术》Exp6 MSF基础应用
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4332466.html
Copyright © 2020-2023  润新知