當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]importjava.lang.reflect.Field;importjava.util.LinkedList;importjava.util.concurrent.ExecutorService;

importjava.lang.reflect.Field;

importjava.util.LinkedList;

importjava.util.concurrent.ExecutorService;

importjava.util.concurrent.Executors;

importjava.util.concurrent.Semaphore;

?

importandroid.graphics.Bitmap;

importandroid.graphics.BitmapFactory;

importandroid.os.Handler;

importandroid.os.Looper;

importandroid.os.Message;

importandroid.support.v4.util.LruCache;

importandroid.util.DisplayMetrics;

importandroid.view.ViewGroup.LayoutParams;

importandroid.widget.ImageView;

?

publicclass?ImageLoader?{

????/**

?????*?圖片緩存的核心類

?????*/

????privateLruCache

????/**

?????*?線程池

?????*/

????privateExecutorService?mThreadPool;

????/**

?????*?隊(duì)列的調(diào)度方式

?????*/

????privateType?mType?=?Type.LIFO;

????/**

?????*?任務(wù)隊(duì)列

?????*/

????privateLinkedList

????/**

?????*?輪詢的線程

?????*/

????privateThread?mPoolThread;

????privateHandler?mPoolThreadHander;

?

????/**

?????*?運(yùn)行在UI線程的handler,用于給ImageView設(shè)置圖片

?????*/

????privateHandler?mHandler;

?

????/**

?????*?引入一個(gè)值為1的信號(hào)量,防止mPoolThreadHander未初始化完成

?????*/

????privatevolatile?Semaphore?mSemaphore?=?newSemaphore(0);

?

????/**

?????*?引入一個(gè)值為1的信號(hào)量,由于線程池內(nèi)部也有一個(gè)阻塞線程,防止加入任務(wù)的速度過(guò)快,使LIFO效果不明顯

?????*/

????privatevolatile?Semaphore?mPoolSemaphore;

?

????privatestatic?ImageLoader?mInstance;

?

????/**

?????*?隊(duì)列的調(diào)度方式

?????*

?????*?@author?zhy

?????*

?????*/

????publicenum?Type?{

????????FIFO,?LIFO

????}

?

????/**

?????*?單例獲得該實(shí)例對(duì)象

?????*

?????*?@return

?????*/

????publicstatic?ImageLoader?getInstance()?{

?

????????if(mInstance?==?null)?{

????????????synchronized(ImageLoader.class)?{

????????????????if(mInstance?==?null)?{

????????????????????mInstance?=?newImageLoader(1,?Type.LIFO);

????????????????}

????????????}

????????}

????????returnmInstance;

????}

?

????privateImageLoader(intthreadCount,?Type?type)?{

????????init(threadCount,?type);

????}

?

????privatevoid?init(intthreadCount,?Type?type)?{

????????//?loop?thread

????????mPoolThread?=?newThread()?{

????????????@Override

????????????publicvoid?run()?{

????????????????Looper.prepare();

?

????????????????mPoolThreadHander?=?newHandler()?{

????????????????????@Override

????????????????????publicvoid?handleMessage(Message?msg)?{

????????????????????????mThreadPool.execute(getTask());

????????????????????????try{

????????????????????????????mPoolSemaphore.acquire();

????????????????????????}catch(InterruptedException?e)?{

????????????????????????}

????????????????????}

????????????????};

????????????????//?釋放一個(gè)信號(hào)量

????????????????mSemaphore.release();

????????????????Looper.loop();

????????????}

????????};

????????mPoolThread.start();

?

????????//?獲取應(yīng)用程序最大可用內(nèi)存

????????intmaxMemory?=?(int)?Runtime.getRuntime().maxMemory();

????????intcacheSize?=?maxMemory?/?8;

????????mLruCache?=?newLruCache

????????????@Override

????????????protectedint?sizeOf(String?key,?Bitmap?value)?{

????????????????returnvalue.getRowBytes()?*?value.getHeight();

????????????};

????????};

?

????????mThreadPool?=?Executors.newFixedThreadPool(threadCount);

????????mPoolSemaphore?=?newSemaphore(threadCount);

????????mTasks?=?newLinkedList

????????mType?=?type?==?null??Type.LIFO?:?type;

?

????}

?

????/**

?????*?加載圖片

?????*

?????*?@param?path

?????*?@param?imageView

?????*/

????publicvoid?loadImage(finalString?path,?finalImageView?imageView)?{

????????//?set?tag

????????imageView.setTag(path);

????????//?UI線程

????????if(mHandler?==?null)?{

????????????mHandler?=?newHandler()?{

????????????????@Override

????????????????publicvoid?handleMessage(Message?msg)?{

????????????????????ImgBeanHolder?holder?=?(ImgBeanHolder)?msg.obj;

????????????????????ImageView?imageView?=?holder.imageView;

????????????????????Bitmap?bm?=?holder.bitmap;

????????????????????String?path?=?holder.path;

????????????????????if(imageView.getTag().toString().equals(path))?{

????????????????????????imageView.setImageBitmap(bm);

????????????????????}

????????????????}

????????????};

????????}

?

????????Bitmap?bm?=?getBitmapFromLruCache(path);

????????if(bm?!=?null)?{

????????????ImgBeanHolder?holder?=?newImgBeanHolder();

????????????holder.bitmap?=?bm;

????????????holder.imageView?=?imageView;

????????????holder.path?=?path;

????????????Message?message?=?Message.obtain();

????????????message.obj?=?holder;

????????????mHandler.sendMessage(message);

????????}else{

????????????addTask(newRunnable()?{

????????????????@Override

????????????????publicvoid?run()?{

?

????????????????????ImageSize?imageSize?=?getImageViewWidth(imageView);

?

????????????????????intreqWidth?=?imageSize.width;

????????????????????intreqHeight?=?imageSize.height;

?

????????????????????Bitmap?bm?=?decodeSampledBitmapFromResource(path,?reqWidth,

????????????????????????????reqHeight);

????????????????????addBitmapToLruCache(path,?bm);

????????????????????ImgBeanHolder?holder?=?newImgBeanHolder();

????????????????????holder.bitmap?=?getBitmapFromLruCache(path);

????????????????????holder.imageView?=?imageView;

????????????????????holder.path?=?path;

????????????????????Message?message?=?Message.obtain();

????????????????????message.obj?=?holder;

????????????????????//?Log.e("TAG",?"mHandler.sendMessage(message);");

????????????????????mHandler.sendMessage(message);

????????????????????mPoolSemaphore.release();

????????????????}

????????????});

????????}

?

????}

?

????/**

?????*?添加一個(gè)任務(wù)

?????*

?????*?@param?runnable

?????*/

????privatesynchronized?void?addTask(Runnable?runnable)?{

????????try{

????????????//?請(qǐng)求信號(hào)量,防止mPoolThreadHander為null

????????????if(mPoolThreadHander?==?null)

????????????????mSemaphore.acquire();

????????}catch(InterruptedException?e)?{

????????}

????????mTasks.add(runnable);

?

????????mPoolThreadHander.sendEmptyMessage(0x110);

????}

?

????/**

?????*?取出一個(gè)任務(wù)

?????*

?????*?@return

?????*/

????privatesynchronized?Runnable?getTask()?{

????????if(mType?==?Type.FIFO)?{

????????????returnmTasks.removeFirst();

????????}elseif?(mType?==?Type.LIFO)?{

????????????returnmTasks.removeLast();

????????}

????????returnnull;

????}

?

????/**

?????*?單例獲得該實(shí)例對(duì)象

?????*

?????*?@return

?????*/

????publicstatic?ImageLoader?getInstance(intthreadCount,?Type?type)?{

?

????????if(mInstance?==?null)?{

????????????synchronized(ImageLoader.class)?{

????????????????if(mInstance?==?null)?{

????????????????????mInstance?=?newImageLoader(threadCount,?type);

????????????????}

????????????}

????????}

????????returnmInstance;

????}

?

????/**

?????*?根據(jù)ImageView獲得適當(dāng)?shù)膲嚎s的寬和高

?????*

?????*?@param?imageView

?????*?@return

?????*/

????privateImageSize?getImageViewWidth(ImageView?imageView)?{

????????ImageSize?imageSize?=?newImageSize();

????????finalDisplayMetrics?displayMetrics?=?imageView.getContext()

????????????????.getResources().getDisplayMetrics();

????????finalLayoutParams?params?=?imageView.getLayoutParams();

?

????????intwidth?=?params.width?==?LayoutParams.WRAP_CONTENT???0:?imageView

????????????????.getWidth();//?Get?actual?image?width

????????if(width?<=?0)

????????????width?=?params.width;?//?Get?layout?width?parameter

????????if(width?<=?0)

????????????width?=?getImageViewFieldValue(imageView,?"mMaxWidth");//?Check

????????????????????????????????????????????????????????????????????//?maxWidth

????????????????????????????????????????????????????????????????????//?parameter

????????if(width?<=?0)

????????????width?=?displayMetrics.widthPixels;

????????intheight?=?params.height?==?LayoutParams.WRAP_CONTENT???0:?imageView

????????????????.getHeight();//?Get?actual?image?height

????????if(height?<=?0)

????????????height?=?params.height;?//?Get?layout?height?parameter

????????if(height?<=?0)

????????????height?=?getImageViewFieldValue(imageView,?"mMaxHeight");//?Check

????????????????????????????????????????????????????????????????????????//?maxHeight

????????????????????????????????????????????????????????????????????????//?parameter

????????if(height?<=?0)

????????????height?=?displayMetrics.heightPixels;

????????imageSize.width?=?width;

????????imageSize.height?=?height;

????????returnimageSize;

?

????}

?

????/**

?????*?從LruCache中獲取一張圖片,如果不存在就返回null。

?????*/

????privateBitmap?getBitmapFromLruCache(String?key)?{

????????returnmLruCache.get(key);

????}

?

????/**

?????*?往LruCache中添加一張圖片

?????*

?????*?@param?key

?????*?@param?bitmap

?????*/

????privatevoid?addBitmapToLruCache(String?key,?Bitmap?bitmap)?{

????????if(getBitmapFromLruCache(key)?==?null)?{

????????????if(bitmap?!=?null)

????????????????mLruCache.put(key,?bitmap);

????????}

????}

?

????/**

?????*?計(jì)算inSampleSize,用于壓縮圖片

?????*

?????*?@param?options

?????*?@param?reqWidth

?????*?@param?reqHeight

?????*?@return

?????*/

????privateint?calculateInSampleSize(BitmapFactory.Options?options,

????????????intreqWidth,?intreqHeight)?{

????????//?源圖片的寬度

????????intwidth?=?options.outWidth;

????????intheight?=?options.outHeight;

????????intinSampleSize?=?1;

?

????????if(width?>?reqWidth?&&?height?>?reqHeight)?{

????????????//?計(jì)算出實(shí)際寬度和目標(biāo)寬度的比率

????????????intwidthRatio?=?Math.round((float)?width?/?(float)?reqWidth);

????????????intheightRatio?=?Math.round((float)?width?/?(float)?reqWidth);

????????????inSampleSize?=?Math.max(widthRatio,?heightRatio);

????????}

????????returninSampleSize;

????}

?

????/**

?????*?根據(jù)計(jì)算的inSampleSize,得到壓縮后圖片

?????*

?????*?@param?pathName

?????*?@param?reqWidth

?????*?@param?reqHeight

?????*?@return

?????*/

????privateBitmap?decodeSampledBitmapFromResource(String?pathName,

????????????intreqWidth,?intreqHeight)?{

????????//?第一次解析將inJustDecodeBounds設(shè)置為true,來(lái)獲取圖片大小

????????finalBitmapFactory.Options?options?=?newBitmapFactory.Options();

????????options.inJustDecodeBounds?=?true;

????????BitmapFactory.decodeFile(pathName,?options);

????????//?調(diào)用上面定義的方法計(jì)算inSampleSize值

????????options.inSampleSize?=?calculateInSampleSize(options,?reqWidth,

????????????????reqHeight);

????????//?使用獲取到的inSampleSize值再次解析圖片

????????options.inJustDecodeBounds?=?false;

????????Bitmap?bitmap?=?BitmapFactory.decodeFile(pathName,?options);

?

????????returnbitmap;

????}

?

????privateclass?ImgBeanHolder?{

????????Bitmap?bitmap;

????????ImageView?imageView;

????????String?path;

????}

?

????privateclass?ImageSize?{

????????intwidth;

????????intheight;

????}

?

????/**

?????*?反射獲得ImageView設(shè)置的最大寬度和高度

?????*

?????*?@param?object

?????*?@param?fieldName

?????*?@return

?????*/

????privatestatic?int?getImageViewFieldValue(Object?object,?String?fieldName)?{

????????intvalue?=?0;

????????try{

????????????Field?field?=?ImageView.class.getDeclaredField(fieldName);

????????????field.setAccessible(true);

????????????intfieldValue?=?(Integer)?field.get(object);

????????????if(fieldValue?>?0&&?fieldValue?<?Integer.MAX_VALUE)?{

????????????????value?=?fieldValue;

????????????}

????????}catch(Exception?e)?{

????????}

????????returnvalue;

????}

?

}

使用很簡(jiǎn)單,如果你在是Adapter中,

雙擊代碼復(fù)制

ImageItem?item?=?getItem(position);

????????String?path?=?item.getPath();

????????ImageView?imageView?=?holder.getImageView(R.id.img_plant);

????????ImageLoader.getInstance().loadImage(path,?imageView);

????????imageView.setImageResource(R.drawable.pictures_no);

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉