OkBitmap自定義圖片加載框架

前言:前幾天做了個(gè)小功能,就是加載圖片需要帶cookie裂允,總之接口就是很傻比很令人費(fèi)解,哎哥艇,**也就這樣了吧>唷?一切都是那么的傻逼就對(duì)了貌踏。因?yàn)轫?xiàng)目里我用的是張洪洋的封裝okhttp十饥,所以自己借鑒了幾篇文章,整理了一個(gè)小框架祖乳,總共5個(gè)類逗堵,如下。

先上個(gè)使用方法吧眷昆,看,就是這么簡(jiǎn)單蜒秤。

/*fangyc 因?yàn)橐獛ookie,所以統(tǒng)一使用okhttp*/
        OkBitmap.okDisPlay(imageView, data);

1亚斋、內(nèi)存緩存類

/**
 * 三級(jí)緩存之內(nèi)存緩存
 */
public class MemoryCacheUtils {

    // private HashMap<String,Bitmap> mMemoryCache=new HashMap<>();//1.因?yàn)閺?qiáng)引用,容易造成內(nèi)存溢出作媚,所以考慮使用下面弱引用的方法
    // private HashMap<String, SoftReference<Bitmap>> mMemoryCache = new HashMap<>();//2.因?yàn)樵贏ndroid2.3+后,系統(tǒng)會(huì)優(yōu)先考慮回收弱引用對(duì)象,官方提出使用LruCache
    private LruCache<String,Bitmap> mMemoryCache;

    public MemoryCacheUtils(){
       final long maxMemory = Runtime.getRuntime().maxMemory()/8;//得到手機(jī)最大允許內(nèi)存的1/8,即超過(guò)指定內(nèi)存,則開(kāi)始回收
        //需要傳入允許的內(nèi)存最大值,虛擬機(jī)默認(rèn)內(nèi)存16M,真機(jī)不一定相同
        mMemoryCache=new LruCache<String,Bitmap>((int) maxMemory){
            //用于計(jì)算每個(gè)條目的大小
            @Override
            protected int sizeOf(String key, Bitmap value) {
                int byteCount = value.getByteCount();
                Log.i("MemoryCacheUtils", "每個(gè)Bitmap大小:" + byteCount + "每個(gè)程序最大內(nèi)存" + maxMemory);
                return byteCount;
            }
        };

    }

    /**
     * 從內(nèi)存中讀圖片
     * @param url
     */
    public Bitmap getBitmapFromMemory(String url) {
        //Bitmap bitmap = mMemoryCache.get(url);//1.強(qiáng)引用方法
            /*2.弱引用方法
            SoftReference<Bitmap> bitmapSoftReference = mMemoryCache.get(url);
            if (bitmapSoftReference != null) {
                Bitmap bitmap = bitmapSoftReference.get();
                return bitmap;
            }
            */
        Bitmap bitmap = mMemoryCache.get(url);
        return bitmap;

    }

    /**
     * 往內(nèi)存中寫(xiě)圖片
     * @param url
     * @param bitmap
     */
    public void setBitmapToMemory(String url, Bitmap bitmap) {
        //mMemoryCache.put(url, bitmap);//1.強(qiáng)引用方法
            /*2.弱引用方法
            mMemoryCache.put(url, new SoftReference<>(bitmap));
            */
        mMemoryCache.put(url,bitmap);
    }
}

//作者:wanbo_
//        鏈接:http://www.reibang.com/p/2cd59a79ed4a
//        來(lái)源:簡(jiǎn)書(shū)
//        著作權(quán)歸作者所有帅刊。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)纸泡,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

2赖瞒、本地緩存類

/**
 * 三級(jí)緩存之本地緩存
 */
public class LocalCacheUtils {

    private static final String CACHE_PATH= Environment.getExternalStorageDirectory().getAbsolutePath()+"/WerbNews";

    /**
     * 從本地讀取圖片
     * @param url
     */
    public Bitmap getBitmapFromLocal(String url){
        String fileName = null;//把圖片的url當(dāng)做文件名,并進(jìn)行MD5加密
        try {
            fileName = MD5Encoder.encode(url);
            File file=new File(CACHE_PATH,fileName);

            Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file));

            return bitmap;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 從網(wǎng)絡(luò)獲取圖片后,保存至本地緩存
     * @param url
     * @param bitmap
     */
    public void setBitmapToLocal(String url,Bitmap bitmap){
        try {
            String fileName = MD5Encoder.encode(url);//把圖片的url當(dāng)做文件名,并進(jìn)行MD5加密
            File file=new File(CACHE_PATH,fileName);

            //通過(guò)得到文件的父文件,判斷父文件是否存在
            File parentFile = file.getParentFile();
            if (!parentFile.exists()){
                parentFile.mkdirs();
            }

            //把圖片保存至本地
            bitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(file));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

//作者:wanbo_
//        鏈接:http://www.reibang.com/p/2cd59a79ed4a
//        來(lái)源:簡(jiǎn)書(shū)
//        著作權(quán)歸作者所有女揭。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)蚤假,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

3吧兔、加密工具類勤哗,在LocalCacheUtils中有使用到

/**
 * MD5加密工具包
 * @author Administrator
 *
 */
public class MD5Encoder {
    private static StringBuilder sb;

    public static String encode(String str){

        try {
            //獲取MD5加密器
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = str.getBytes();
            byte[] digest = md.digest(bytes);
            sb = new StringBuilder();
            for (byte b : digest) {
                //把每個(gè)字節(jié)轉(zhuǎn)成16進(jìn)制數(shù)
                int d = b & 0xff;
                String hexString = Integer.toHexString(d);
                if (hexString.length() == 1) {
                    hexString = "0" + hexString;
                }
                sb.append(hexString);
                System.out.println();
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return sb + "";
    }
}

4、原生的網(wǎng)絡(luò)加載類

/**
 * 三級(jí)緩存之網(wǎng)絡(luò)緩存
 */
public class NetCacheUtils {

    private LocalCacheUtils mLocalCacheUtils;
    private MemoryCacheUtils mMemoryCacheUtils;

    public NetCacheUtils(LocalCacheUtils localCacheUtils, MemoryCacheUtils memoryCacheUtils) {
        mLocalCacheUtils = localCacheUtils;
        mMemoryCacheUtils = memoryCacheUtils;
    }

    /**
     * 從網(wǎng)絡(luò)下載圖片
     * @param ivPic 顯示圖片的imageview
     * @param url   下載圖片的網(wǎng)絡(luò)地址
     */
    public void getBitmapFromNet(ImageView ivPic, String url) {
        new BitmapTask().execute(ivPic, url);//啟動(dòng)AsyncTask

    }

    /**
     * AsyncTask就是對(duì)handler和線程池的封裝
     * 第一個(gè)泛型:參數(shù)類型
     * 第二個(gè)泛型:更新進(jìn)度的泛型
     * 第三個(gè)泛型:onPostExecute的返回結(jié)果
     */
    class BitmapTask extends AsyncTask<Object, Void, Bitmap> {

        private ImageView ivPic;
        private String url;

        /**
         * 后臺(tái)耗時(shí)操作,存在于子線程中
         * @param params
         * @return
         */
        @Override
        protected Bitmap doInBackground(Object[] params) {
            ivPic = (ImageView) params[0];
            url = (String) params[1];

            return downLoadBitmap(url);
        }

        /**
         * 更新進(jìn)度,在主線程中
         * @param values
         */
        @Override
        protected void onProgressUpdate(Void[] values) {
            super.onProgressUpdate(values);
        }

        /**
         * 耗時(shí)方法結(jié)束后執(zhí)行該方法,主線程中
         * @param result
         */
        @Override
        protected void onPostExecute(Bitmap result) {
            if (result != null) {
                ivPic.setImageBitmap(result);
                System.out.println("從網(wǎng)絡(luò)緩存圖片啦.....");

                //從網(wǎng)絡(luò)獲取圖片后,保存至本地緩存
                mLocalCacheUtils.setBitmapToLocal(url, result);
                //保存至內(nèi)存中
                mMemoryCacheUtils.setBitmapToMemory(url, result);

            }
        }
    }

    /**
     * 網(wǎng)絡(luò)下載圖片
     * @param url
     * @return
     */
    private Bitmap downLoadBitmap(String url) {
        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection) new URL(url).openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setRequestMethod("GET");

            int responseCode = conn.getResponseCode();
            if (responseCode == 200) {
                //圖片壓縮
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize=2;//寬高壓縮為原來(lái)的1/2
                options.inPreferredConfig=Bitmap.Config.ARGB_4444;
                Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream(),null,options);
                return bitmap;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            conn.disconnect();
        }

        return null;
    }
}

//作者:wanbo_
//        鏈接:http://www.reibang.com/p/2cd59a79ed4a
//        來(lái)源:簡(jiǎn)書(shū)
//        著作權(quán)歸作者所有掩驱。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)芒划,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

5欧穴、最后一個(gè)民逼,供調(diào)用的靜態(tài)類。其中一個(gè)方法需要使用到okhttp涮帘,可以將這幾個(gè)類整合到okhttp中拼苍,如若沒(méi)有使用okhttp,也可以將改方法屏蔽调缨,直接使用原生類加載網(wǎng)絡(luò)圖片也行疮鲫。

/**
 * @desc 很粗糙的圖片加載
 * @auth 方毅超
 * @time 2017/9/13 16:50
 */

public class OkBitmap {

//    private static OkBitmap okBitmap;

    private static NetCacheUtils mNetCacheUtils;
    private static LocalCacheUtils mLocalCacheUtils;
    private static MemoryCacheUtils mMemoryCacheUtils;


    static {
//        okBitmap = new OkBitmap();
        mMemoryCacheUtils = new MemoryCacheUtils();
        mLocalCacheUtils = new LocalCacheUtils();
        mNetCacheUtils = new NetCacheUtils(mLocalCacheUtils, mMemoryCacheUtils);
    }

    public static void disPlay(ImageView ivPic, String url) {
//        ivPic.setImageResource(R.mipmap.logo_ehome);
        Bitmap bitmap;
        //內(nèi)存緩存
        bitmap = mMemoryCacheUtils.getBitmapFromMemory(url);
        if (bitmap != null) {
            ivPic.setImageBitmap(bitmap);
            System.out.println("從內(nèi)存獲取圖片啦.....");
            return;
        }

        //本地緩存
        bitmap = mLocalCacheUtils.getBitmapFromLocal(url);
        if (bitmap != null) {
            ivPic.setImageBitmap(bitmap);
            System.out.println("從本地獲取圖片啦.....");
            //從本地獲取圖片后,保存至內(nèi)存中
            mMemoryCacheUtils.setBitmapToMemory(url, bitmap);
            return;
        }
        //網(wǎng)絡(luò)緩存
        mNetCacheUtils.getBitmapFromNet(ivPic, url);
    }

    //fangyc 2017-09-13 使用okhttp請(qǐng)求
    public static void okDisPlay(final ImageView ivPic, final String url) {
//        ivPic.setImageResource(R.mipmap.logo_ehome);
        Bitmap bitmap;
        //內(nèi)存緩存
        bitmap = mMemoryCacheUtils.getBitmapFromMemory(url);
        if (bitmap != null) {
            ivPic.setImageBitmap(bitmap);
            System.out.println("從內(nèi)存獲取圖片啦.....");
            return;
        }

        //本地緩存
        bitmap = mLocalCacheUtils.getBitmapFromLocal(url);
        if (bitmap != null) {
            ivPic.setImageBitmap(bitmap);
            System.out.println("從本地獲取圖片啦.....");
            //從本地獲取圖片后,保存至內(nèi)存中
            mMemoryCacheUtils.setBitmapToMemory(url, bitmap);
            return;
        }
        //網(wǎng)絡(luò)緩存
//        mNetCacheUtils.getBitmapFromNet(ivPic, url);
         /*fangyc 因?yàn)橐獛ookie,所以統(tǒng)一使用okhttp*/
        OkHttpUtils.get().url(url).build().execute(new BitmapCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
//                ivPic.setImageResource(R.drawable.defauit);
            }

            @Override
            public void onResponse(Bitmap response, int id) {
                ivPic.setImageBitmap(response);
                //從網(wǎng)絡(luò)獲取圖片后,保存至本地緩存
                mLocalCacheUtils.setBitmapToLocal(url, response);
                //保存至內(nèi)存中
                mMemoryCacheUtils.setBitmapToMemory(url, response);
            }
        });
    }


//    String url;
//    int resourceId;
////    ImageView imageView;
////    static Context mContext;
//
//    public static OkBitmap init(){
////        mContext = ctx;
//        return okBitmap;
//    }
//
//    public OkBitmap load(String string) {
//        this.url = string;
//        return this;
//    }
//
//
//    public OkBitmap placeholder(int resourceId) {
//        this.resourceId = resourceId;
//        return this;
//    }
//
//
//    public OkBitmap into(ImageView view) {
////        this.imageView = view;
//        return this;
//    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弦叶,一起剝皮案震驚了整個(gè)濱河市俊犯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伤哺,老刑警劉巖燕侠,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異立莉,居然都是意外死亡绢彤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蜓耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茫舶,“玉大人,你說(shuō)我怎么就攤上這事刹淌∪氖希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵芦鳍,是天一觀的道長(zhǎng)嚷往。 經(jīng)常有香客問(wèn)我葛账,道長(zhǎng)柠衅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任籍琳,我火速辦了婚禮菲宴,結(jié)果婚禮上贷祈,老公的妹妹穿的比我還像新娘。我一直安慰自己喝峦,他們只是感情好势誊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谣蠢,像睡著了一般粟耻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眉踱,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天挤忙,我揣著相機(jī)與錄音,去河邊找鬼谈喳。 笑死册烈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婿禽。 我是一名探鬼主播赏僧,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扭倾!你這毒婦竟也來(lái)了淀零?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤膛壹,失蹤者是張志新(化名)和其女友劉穎窑滞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恢筝,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哀卫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撬槽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片此改。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侄柔,靈堂內(nèi)的尸體忽然破棺而出共啃,到底是詐尸還是另有隱情,我是刑警寧澤暂题,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布移剪,位于F島的核電站,受9級(jí)特大地震影響薪者,放射性物質(zhì)發(fā)生泄漏纵苛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攻人。 院中可真熱鬧取试,春花似錦、人聲如沸怀吻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蓬坡。三九已至猿棉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屑咳,已是汗流浹背铺根。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乔宿,地道東北人位迂。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像详瑞,于是被迫代替她去往敵國(guó)和親掂林。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理坝橡,服務(wù)發(fā)現(xiàn)泻帮,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 一起吵吵鬧鬧十幾年的女同學(xué)计寇,在今天與她的先生結(jié)束了為期六年的愛(ài)情馬拉松锣杂,終于走進(jìn)了婚姻的殿堂,修成了正果番宁。在鎂光燈...
    莫秋言閱讀 393評(píng)論 0 1
  • 看了電影《年輕氣盛》元莫,突然有很多話想說(shuō),這些話可能顯得「年輕氣盛」了點(diǎn)蝶押,但是踱蠢,看著前幾日漸漸有了起色的大銀幕這幾日...
    落鳳閱讀 298評(píng)論 0 1
  • 觀影《加勒比海盜5》 今天一個(gè)人去影院看了這部電影,好像現(xiàn)在越來(lái)越享受一個(gè)人看電影了棋电,可以全身心地投入到電影情節(jié)里...
    FightingRia閱讀 172評(píng)論 0 0