加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

线程池+缓存+Handler 异步加载网络图片

发布时间:2020-12-15 00:28:21 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 import java.lang.ref.SoftReference;import java.net.URL;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ExecutorSer

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.Log;
 
/**
* 线程池+缓存+Handler加载图片
*/
public class AsyncLoadImage {
    //缓存
    private Map<String,SoftReference<Drawable>> imageCache = new HashMap<String,SoftReference<Drawable>>();
    //线程池
    private ExecutorService executorService = Executors.newFixedThreadPool(20);//总共有10个线程循环使用
    //Hanlder
    private Handler mHandler = new Handler();
    public interface ImageCallback {
        void imageLoad(Drawable image,String imageUrl);
    }
    /**
     *
     * @param imageUrl 图片的地址
     * @param imageCallback 回调接口
     * @return 返回内存中缓存的图像 第一次返回null
     */
    public Drawable loadDrawable(final String imageUrl,final ImageCallback imageCallback) {
        Log.i("AsyncLoadImage","loadDrawable()" + imageUrl);
        //如果缓存中有则从缓存中取出来
        if(imageCache.containsKey(imageUrl)) {
            SoftReference<Drawable> softReference = imageCache.get(imageUrl);
            if(softReference.get() != null) { //判断是否有drawable
                return softReference.get(); //有则返回
            }
        }
        //使用线程池下载图片
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    //                                        final Drawable drawable = Drawable.createFromStream(new URL(imageUrl).openStream(),"image.jpg");
                    final Drawable drawable = getDrawableFormUrl(imageUrl); //调用获取数据的方法
                    imageCache.put(imageUrl,new SoftReference<Drawable>(drawable));//将加载的图片放入到内存中
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            imageCallback.imageLoad(drawable,imageUrl); //接口回调
                        }
                    });
                } catch (Exception e) {
                    throw new RuntimeException();
                }
            }
 
        });
        return null ;
    }
    /**
     * 从网络上获取数据
     */
    public Drawable getDrawableFormUrl(String imageUrl) {
        Drawable drawable = null ;
        try {
            drawable = Drawable.createFromStream(new URL(imageUrl).openStream(),"image.jpg");
        } catch (Exception e) {
            throw new RuntimeException();
        }
        return drawable ;
    }
 
}

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读