摘要:前言一直以來都在用第三方框架加載圖片,因為這樣會省下不少的開發(fā)成本,常用的一些如以及谷歌官方的圖片框架或者相似的都基本上能夠滿足我們開發(fā)的需求。
前言
一直以來都在用第三方框架加載圖片,因為這樣會省下不少的開發(fā)成本,常用的一些如universal-image-loader以及谷歌官方的圖片框架glide或者相似的picasso都基本上能夠滿足我們開發(fā)的需求。
本著學習的態(tài)度,在參考了若干案例之后,站著擼了一個類似universal-image-loader的框架,怎么評價它呢,一句話:湊合湊合能用吧~
已并入我自己寫的小工具AnnUtils的imageloader模塊,傳送門:github
圖片加載緩存,工作原理:根據相關url加載圖片時,第一先從內存緩存中查找是否有該圖片的緩存,然后從文件緩存中查找是否有緩存,最后從指定的url中下載圖片。
主要代碼主要方法:
public void displayImage(String url, ImageView imageView, int requiredSize, OnImageLoaderListener listener) { imageViews.put(imageView, url); // 先從內存緩存中查找 Bitmap bitmap = memoryCache.get(url); if (bitmap != null){ imageView.setImageBitmap(bitmap); if(null != listener){ listener.onFinishedImageLoader(imageView, bitmap); // 通知完成加載 } } else { // 若沒有的話則設置成默認圖片,并開啟新線程加載真實需要的圖片 imageView.setImageResource(config.getDefaultResId()); loadPhoto(url, imageView, requiredSize, listener); } }
加載網絡圖片以及回調進度參數的方法
/** * 執(zhí)行網絡請求加載圖片 * @param url * @param requiredSize * @return */ private Bitmap getBitmap(String url, int requiredSize, PhotoToLoad photoToLoad) { File f = fileCache.getFile(url); // 先從文件緩存中查找是否有 Bitmap b = decodeFile(f, requiredSize); if (b != null) return b; // 最后從指定的url中下載圖片 try { Bitmap bitmap = null; URL imageUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) imageUrl .openConnection(); conn.setConnectTimeout(30000); conn.setReadTimeout(30000); conn.setInstanceFollowRedirects(true); InputStream is = conn.getInputStream(); OutputStream os = new FileOutputStream(f); // CopyStream(is, os, conn.getContentLength(), photoToLoad); photoToLoad.totalSize = conn.getContentLength(); int buffer_size = 1024; byte[] bytes = new byte[buffer_size]; for (; ; ) { int count = is.read(bytes, 0, buffer_size); if (count == -1){ break; } os.write(bytes, 0, count); if(null != photoToLoad.onImageLoaderListener){ // 如果設置了圖片加載監(jiān)聽,則回調 Message msg = handler.obtainMessage(); photoToLoad.currentSize += count; msg.arg1 = IMAGE_LOADER_PROCESS; msg.obj = photoToLoad; handler.sendMessage(msg); } } is.close(); os.close(); bitmap = decodeFile(f, requiredSize); return bitmap; } catch (Exception ex) { ex.printStackTrace(); return null; } }
具體實現可以參考源碼
使用方式 配置初始化AnnImageLoader.init(getApplicationContext(), new CacheConfig() .setDefRequiredSize(600) // 設置默認的加載圖片尺寸(表示寬高任一不超過該值,默認是70px) .setDefaultResId(R.drawable.ic_launcher) // 設置顯示的默認圖片(默認是0,即空白圖片) .setBitmapConfig(Bitmap.Config.ARGB_8888) // 設置圖片位圖模式(默認是Bitmap.CacheConfig.ARGB_8888) .setMemoryCachelimit(Runtime.getRuntime().maxMemory() / 3) // 設置圖片內存緩存大小(默認是Runtime.getRuntime().maxMemory() / 4) .setFileCachePath(Environment.getExternalStorageDirectory().toString() + "/mycache") // 設置文件緩存保存目錄 );顯示圖片
AnnImageLoader.getInstances().displayImage(url,imageview, new AnnImageLoader.OnImageLoaderListener() { @Override public void onProgressImageLoader(ImageView imageView, int currentSize, int totalSize) { //進度條 } @Override public void onFinishedImageLoader(ImageView imageView, Bitmap bitmap) { //加載結束 } });總結
實現的方式很簡單,有網絡,有自定義控件,有涉及內存的使用,雖然還有很多的不足,但是從中總結到了許多自己平常需要用到的知識,就當作是自己的一個鍛煉吧。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67586.html
摘要:加載并顯示圖片或加載并執(zhí)行回調接口。加載圖片主要分為三類接口表示異步加載并顯示圖片到對應的上。以上三類接口最終都會調用到這個函數進行圖片加載。不允許訪問網絡的圖片下載器。創(chuàng)建圖片下載器,返回一個。 1. 功能介紹 1.1 Android Universal Image Loader Android Universal Image Loader 是一個強大的、可高度定制的圖片緩存,本文簡...
摘要:若攔截事件返回為,表示攔截,事件不會向下層的或者傳遞,表示不攔截,繼續(xù)分發(fā)事件。五注冊反注冊未成對使用引起的內存泄漏。七集合對象沒有及時清理引起的內存泄漏。 原文鏈接:https://blog.csdn.net/wen_hah... 版權聲明:本文為博主原創(chuàng)文章,轉載請附上博文鏈接! 前言 金三銀四到來了,找工作的好時候到了,小伙伴們是不是都在忙著找工作呢,小弟前一陣也是忙著在找工作,...
閱讀 2562·2021-09-22 15:25
閱讀 2973·2021-09-14 18:03
閱讀 1226·2021-09-09 09:33
閱讀 1708·2021-09-07 09:59
閱讀 2937·2021-07-29 13:50
閱讀 1505·2019-08-30 15:44
閱讀 1722·2019-08-29 16:22
閱讀 1293·2019-08-29 12:49