美文网首页
加载图片的小逻辑

加载图片的小逻辑

作者: 蒸汽飞船 | 来源:发表于2016-08-01 17:52 被阅读19次
package com.yiche.autoeasy.tool;

import android.graphics.Bitmap;
import android.text.TextUtils;
import android.view.View;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

import java.io.File;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;

/**
 * 加载图片的逻辑
 */
public class BitmapLoadEngine {

    public interface BimapLoader {
         String getImageUrl();
        /**参考用的 暂未用到*/
         ImageSize getImageSize();
        /**图片加载完成*/
         void onBitmapLoaded(Bitmap bitmap,File bitmapFile);
        /**标记加载是否完成,预防意外情况的一个方法,一般用不到*/
         boolean isLoadFinished();
    }

    private static BitmapLoadEngine instance = new BitmapLoadEngine();

    public static BitmapLoadEngine getInstance() {
        return instance;
    }

    private final Map<String, List<BimapLoader>> requestMap;

    private BitmapLoadEngine() {
        this.requestMap = Collections.synchronizedMap(new WeakHashMap<String, List<BimapLoader>>());
    }


    public void add(BimapLoader loader) {
        if (loader == null || TextUtils.isEmpty(loader.getImageUrl())) {
            return;
        }
        String imageUrl = loader.getImageUrl();
        List<BimapLoader> requestList;
        synchronized (requestMap) {
            requestList = requestMap.get(imageUrl);
            if (requestList == null) {
                requestList = Collections.synchronizedList(new LinkedList<BimapLoader>());
                requestMap.put(imageUrl, requestList);
            }
        }
        requestList.add(loader);
        Iterator<BimapLoader> iterator = requestList.iterator();
        while (iterator.hasNext()) {
            if (iterator.next().isLoadFinished()) {
                iterator.remove();
            }
        }
        ImageLoader.getInstance().loadImage(imageUrl, loader.getImageSize(), EasyImageLoaderOptions.OPT_DEFAUTL,
                new BitmapLoadListener(imageUrl, loader.getImageSize()));
    }

    /**
     * 图片加载监听
     */
    private final class BitmapLoadListener implements ImageLoadingListener {
        String url;
        int width = 0;
        int height = 0;

        public BitmapLoadListener(String url, ImageSize imageSize) {
            this.url = url;
            if (imageSize != null) {
                width = imageSize.getWidth();
                height = imageSize.getHeight();
            }
        }

        @Override
        public void onLoadingStarted(String s, View view) {
        }

        @Override
        public void onLoadingFailed(String s, View view, FailReason failReason) {
        }

        @Override
        public void onLoadingComplete(String s, View view, Bitmap bitmap) {
           File bitmapFile =  EasyImageLoader.getInstance().getLoader().getDiskCache().get(s);
            onBitmapLoaded(bitmap, bitmapFile,url, width, height);
        }

        @Override
        public void onLoadingCancelled(String s, View view) {
        }
    }

    public void onBitmapLoaded(Bitmap bitmap,  File bitmapFile,String url, int width, int height) {
        List<BimapLoader> requestList = requestMap.get(url);
        if (requestList == null) {
            return;
        }
        Iterator<BimapLoader> iterator = requestList.iterator();
        while (iterator.hasNext()) {
            BimapLoader bimapLoader = iterator.next();
            if (bimapLoader.isLoadFinished()) {
                iterator.remove();
            } else {
                bimapLoader.onBitmapLoaded(bitmap,bitmapFile);
                iterator.remove();
            }
        }
    }
}

相关文章

网友评论

      本文标题:加载图片的小逻辑

      本文链接:https://www.haomeiwen.com/subject/mptfsttx.html