android下载网络图片并缓存.docx

上传人:b****8 文档编号:29814344 上传时间:2023-07-27 格式:DOCX 页数:16 大小:19.51KB
下载 相关 举报
android下载网络图片并缓存.docx_第1页
第1页 / 共16页
android下载网络图片并缓存.docx_第2页
第2页 / 共16页
android下载网络图片并缓存.docx_第3页
第3页 / 共16页
android下载网络图片并缓存.docx_第4页
第4页 / 共16页
android下载网络图片并缓存.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

android下载网络图片并缓存.docx

《android下载网络图片并缓存.docx》由会员分享,可在线阅读,更多相关《android下载网络图片并缓存.docx(16页珍藏版)》请在冰豆网上搜索。

android下载网络图片并缓存.docx

android下载网络图片并缓存

 

android下载网络图片并缓存

分类:

 图片缓存加载2014-02-1210:

58 2320人阅读 评论(0) 收藏 举报

异步下载网络图片,并提供是否缓存至内存或外部文件的功能

异步加载类AsyncImageLoader

   publicvoiddownloadImage(finalStringurl,finalImageCallbackcallback);

   publicvoiddownloadImage(finalStringurl,finalbooleancache2Memory,finalImageCallbackcallback);

   publicvoidsetCache2File(booleanflag);

   publicvoidsetCachedDir(Stringdir);

图片下载和缓存实现类LoaderImpl

1.AsyncImageLoader.java

[java] viewplaincopy

1.package com.imagecache;  

2.  

3.import java.lang.ref.SoftReference;  

4.import java.util.HashMap;  

5.import java.util.HashSet;  

6.import java.util.Map;  

7.import java.util.concurrent.ExecutorService;  

8.import java.util.concurrent.Executors;  

9.  

10.import android.content.Context;  

11.import android.graphics.Bitmap;  

12.import android.os.Handler;  

13.import android.util.Log;  

14.  

15.public class AsyncImageLoader {  

16.    //保存正在下载的图片URL集合,避免重复下载用  

17.    private static HashSet sDownloadingSet;  

18.    //软引用内存缓存  

19.    private static Map> sImageCache;   

20.    //图片三种获取方式管理者,网络URL获取、内存缓存获取、外部文件缓存获取  

21.    private static LoaderImpl impl;  

22.    //线程池相关  

23.    private static ExecutorService sExecutorService;  

24.      

25.    //通知UI线程图片获取ok时使用  

26.    private Handler handler;   

27.      

28.      

29.    /** 

30.     * 异步加载图片完毕的回调接口 

31.     */  

32.    public interface ImageCallback{  

33.        /** 

34.         * 回调函数 

35.         * @param bitmap:

 may be null!

 

36.         * @param imageUrl  

37.         */  

38.        public void onImageLoaded(Bitmap bitmap, String imageUrl);  

39.    }  

40.      

41.    static{  

42.        sDownloadingSet = new HashSet();  

43.        sImageCache = new HashMap>();  

44.        impl = new LoaderImpl(sImageCache);  

45.    }  

46.  

47.    public AsyncImageLoader(Context context){  

48.        handler = new Handler();  

49.        startThreadPoolIfNecessary();  

50.          

51.        String defaultDir = context.getCacheDir().getAbsolutePath();  

52.        setCachedDir(defaultDir);  

53.    }  

54.      

55.    /** 

56.     * 是否缓存图片至/data/data/package/cache/目录 

57.     * 默认不缓存 

58.     */  

59.    public void setCache2File(boolean flag){  

60.        impl.setCache2File(flag);  

61.    }  

62.      

63.    /** 

64.     * 设置缓存路径,setCache2File(true)时有效 

65.     */  

66.    public void setCachedDir(String dir){  

67.        impl.setCachedDir(dir);  

68.    }  

69.  

70.    /**开启线程池*/  

71.    public static void startThreadPoolIfNecessary(){  

72.        if(sExecutorService == null || sExecutorService.isShutdown() || sExecutorService.isTerminated()){  

73.            sExecutorService = Executors.newFixedThreadPool(3);  

74.            //sExecutorService = Executors.newSingleThreadExecutor();  

75.        }  

76.    }  

77.      

78.    /** 

79.     * 异步下载图片,并缓存到memory中 

80.     * @param url    

81.     * @param callback  see ImageCallback interface 

82.     */  

83.    public void downloadImage(final String url, final ImageCallback callback){  

84.        downloadImage(url, true, callback);  

85.    }  

86.      

87.    /** 

88.     *  

89.     * @param url 

90.     * @param cache2Memory 是否缓存至memory中 

91.     * @param callback 

92.     */  

93.    public void downloadImage(final String url, final boolean cache2Memory, final ImageCallback callback){  

94.        if(sDownloadingSet.contains(url)){  

95.            Log.i("AsyncImageLoader", "###该图片正在下载,不能重复下载!

");  

96.            return;  

97.        }  

98.          

99.        Bitmap bitmap = impl.getBitmapFromMemory(url);  

100.        if(bitmap !

= null){  

101.            if(callback !

= null){  

102.                callback.onImageLoaded(bitmap, url);  

103.            }  

104.        }else{  

105.            //从网络端下载图片  

106.            sDownloadingSet.add(url);  

107.            sExecutorService.submit(new Runnable(){  

108.                @Override  

109.                public void run() {  

110.                    final Bitmap bitmap = impl.getBitmapFromUrl(url, cache2Memory);  

111.                    handler.post(new Runnable(){  

112.                        @Override  

113.                        public void run(){  

114.                            if(callback !

= null)  

115.                                callback.onImageLoaded(bitmap, url);  

116.                            sDownloadingSet.remove(url);  

117.                        }  

118.                    });  

119.                }  

120.            });  

121.        }  

122.    }  

123.      

124.    /** 

125.     * 预加载下一张图片,缓存至memory中 

126.     * @param url  

127.     */  

128.    public void preLoadNextImage(final String url){  

129.        //将callback置为空,只将bitmap缓存到memory即可。

  

130.        downloadImage(url, null);  

131.    }  

132.      

133.}  

2.LoaderImpl.java

[java] viewplaincopy

1.package com.imagecache;  

2.  

3.import java.io.FileInputStream;  

4.import java.io.FileNotFoundException;  

5.import java.io.FileOutputStream;  

6.import java.io.IOException;  

7.import java.io.InputStream;  

8.import java.io.UnsupportedEncodingException;  

9.import java.lang.ref.SoftReference;  

10.import .HttpURLConnection;  

11.import .URL;  

12.import java.security.MessageDigest;  

13.import java.security.NoSuchAlgorithmException;  

14.import java.util.Map;  

15.  

16.import android.graphics.Bitmap;  

17.import android.graphics.BitmapFactory;  

18.  

19./** 

20. *  

21. * @author Administrator 

22. * @desc 异步加载图片管理器 

23. * 

24. */  

25.public class LoaderImpl {  

26.    //内存中的软应用缓存  

27.    private Map> imageCache;  

28.      

29.    //是否缓存图片至本地文件  

30.    private boolean cache2FileFlag = false;  

31.      

32.    //缓存目录,默认是/data/data/package/cache/目录  

33.    private String cachedDir;  

34.      

35.    public LoaderImpl(Map> imageCache){  

36.        this.imageCache = imageCache;  

37.    }  

38.      

39.    /** 

40.     * 是否缓存图片至外部文件 

41.     * @param flag  

42.     */  

43.    public void setCache2File(boolean flag){  

44.        cache2FileFlag = flag;  

45.    }  

46.      

47.    /** 

48.     * 设置缓存图片到外部文件的路径 

49.     * @param cacheDir 

50.     */  

51.    public void setCachedDir(String cacheDir){  

52.        this.cachedDir = cacheDir;  

53.    }  

54.      

55.    /** 

56.     * 从网络端下载图片 

57.     * @param url 网络图片的URL地址 

58.     * @param cache2Memory 是否缓存(缓存在内存中) 

59.     * @return bitmap 图片bitmap结构 

60.     *  

61.     */  

62.    public Bitmap getBitmapFromUrl(String url, boolean cache2Memory){  

63.        Bitmap bitmap = null;  

64.        try{  

65.            URL u = new URL(url);  

66.            HttpURLConnection conn = (HttpURLConnection)u.openConnection();    

67.            InputStream is = conn.getInputStream();  

68.            bitmap = BitmapFactory.decodeStream(is);  

69.              

70.            if(cache2Memory){  

71.                //1.缓存bitmap至内存软引用中  

72.                imageCache.put(url, new SoftReference(bitmap));  

73.                if(cache2FileFlag){  

74.                    //2.缓存bitmap至/data/data/packageName/cache/文件夹中  

75.                    String fileName = getMD5Str(url);  

76.                    String filePath = this.cachedDir + "/" +fileName;  

77.                    FileOutputStream fos = new FileOutputStream(filePath);  

78.                    press(Bitmap.CompressFormat.PNG, 100, fos);  

79.                }  

80.            }  

81.              

82.            is.close();  

83.            conn.disconnect();  

84.            return bitmap;  

85.        }catch(IOException e){  

86.            e.printStackTrace();  

87.            return null;  

88.        }  

89.    }  

90.      

91.    /** 

92.     * 从内存缓存中获取bitmap 

93.     * @param url 

94.     * @return bitmap or null. 

95.     */  

96.    public Bitmap getBitmapFromMemory(String url){  

97.        Bitmap bitmap = null;  

98.        if(imageCache.containsKey(url)){  

99.            synchronized(imageCache){  

100.                SoftReference bitmapRef = imageCache.get(url);  

101.                if(bitmapRef !

= null){  

102.                    bitmap = bitmapRef.get();  

103.                    return bitmap;  

104.                }  

105.            }  

106.        }  

107.        //从外部缓存文件读取  

108.        if(cache2FileFlag){  

109.            bitmap = getBitmapFromFile(url);  

110.            if(bitmap !

= null)  

111.                imageCache.put(url, new SoftReference(bitmap));  

112.        }  

113.          

114.        return bitmap;  

115.    }  

116.      

117.    /** 

118.     * 从外部文件缓存中获取bitmap 

119.     * @param url 

120.     * @return 

121.     */  

122.    private Bitmap getBitmapFromFile(String url){  

123.        Bitmap bitmap = null;  

124.        String fileName = getMD5Str(url);  

125.        if(fileName == null)  

126.            return null;  

127.          

128.        String filePath = cachedDir + "/" + fileName;  

129.          

130.        try {  

131.            FileInputStream fis = new FileInputStream(filePath);  

132.            bitmap = BitmapFactory.decodeStream(fis);  

133.        } catch (FileNotFoundException e) {  

134.            e.printStackTrace();  

135.            bitmap = null;  

136.        }  

137.        return bitmap;  

138.    }  

139.      

140.      

141.    /**   

142.     * MD5 加密   

14

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1