www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 芯聞號 > 充電吧
[導讀]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;

????/**

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

?????*/

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

????/**

?????*?任務隊列

?????*/

????privateLinkedList

????/**

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

?????*/

????privateThread?mPoolThread;

????privateHandler?mPoolThreadHander;

?

????/**

?????*?運行在UI線程的handler,用于給ImageView設置圖片

?????*/

????privateHandler?mHandler;

?

????/**

?????*?引入一個值為1的信號量,防止mPoolThreadHander未初始化完成

?????*/

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

?

????/**

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

?????*/

????privatevolatile?Semaphore?mPoolSemaphore;

?

????privatestatic?ImageLoader?mInstance;

?

????/**

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

?????*

?????*?@author?zhy

?????*

?????*/

????publicenum?Type?{

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

????}

?

????/**

?????*?單例獲得該實例對象

?????*

?????*?@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)?{

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

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

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

????????????????//?釋放一個信號量

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

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

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

????????};

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

?

????????//?獲取應用程序最大可用內(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();

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

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

????????}

?

????}

?

????/**

?????*?添加一個任務

?????*

?????*?@param?runnable

?????*/

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

????????try{

????????????//?請求信號量,防止mPoolThreadHander為null

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

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

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

????????}

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

?

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

????}

?

????/**

?????*?取出一個任務

?????*

?????*?@return

?????*/

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

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

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

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

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

????????}

????????returnnull;

????}

?

????/**

?????*?單例獲得該實例對象

?????*

?????*?@return

?????*/

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

?

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

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

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

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

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

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

????????}

????????returnmInstance;

????}

?

????/**

?????*?根據(jù)ImageView獲得適當?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);

????????}

????}

?

????/**

?????*?計算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)?{

????????????//?計算出實際寬度和目標寬度的比率

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

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

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

????????}

????????returninSampleSize;

????}

?

????/**

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

?????*

?????*?@param?pathName

?????*?@param?reqWidth

?????*?@param?reqHeight

?????*?@return

?????*/

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

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

????????//?第一次解析將inJustDecodeBounds設置為true,來獲取圖片大小

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

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

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

????????//?調(diào)用上面定義的方法計算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設置的最大寬度和高度

?????*

?????*?@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;

????}

?

}

使用很簡單,如果你在是Adapter中,

雙擊代碼復制

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)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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