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

當(dāng)前位置:首頁 > > 充電吧
[導(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ù)的速度過快,使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,來獲取圖片大小

????????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)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉