日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Imageloader6-mUIHandler的初始化

發布時間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Imageloader6-mUIHandler的初始化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UIHandler的初始化我們并沒有在init()初始化,考慮到邏輯性和合理性,我們在加載圖片的時候進行初始化UIHandler。核心代碼loadImage(String path ,ImageView imageView)方法。

思考下,loadImage() 方法,需要根據圖片路徑,將對應的圖片設置到ImageView中,所以loadImage()方法有2個入參,String path 和 ImageView imageView.

根據我們的策略:加載圖片首先從緩存中查找,如果找到直接返回回調UIHandler的handleMessage()設置圖片,如果緩存中沒有則開啟任務去加載圖片并添加到緩存。這個Task任務是由任務隊列TaskQueue管理,所以我們需要將任務添加到任務隊列中,然后通過Looper+Message+Handler機制 發送通知,通知后臺輪詢線程,通知線程池根據用戶選擇的圖片加載策略去獲取一個task即Runnable對象去加載圖片。

/*** 加載圖片的核心方法* 實例化UIHanlder* 首先從緩存中獲取,如果獲取不到,** @param path* @param imageView*/public void loadImage(String path, final ImageView imageView) {// 設置標簽,防止多次調用圖片加載時的混亂imageView.setTag(path);// 初始化UIHandlerif (mUIHandler == null) {mUIHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// 將圖片設置到ImageViewImageBeanHoler holer = (ImageBeanHoler)msg.obj ;ImageView imageView1 = holer.imageView ;Bitmap bitmap = holer.bitmap ;String path = holer.path ;// 將path和getTag一致 這設置圖片。// 比如換到第二屏的時候,path已經改變,但imageView是復用的,所以要判斷下是否相等if(imageView.getTag().toString().equals(path)){imageView.setImageBitmap(bitmap);}}};}// 從緩存中獲取圖片Bitmap bitmap = getBitmapFromLruCache(path);// 圖片不為空 ,發送消息 更新圖片if (bitmap != null) {Message message = Message.obtain();// 在此處賦值,確保回調handlerMessage()獲取的是同一個bitmap imageView 和 pathImageBeanHoler holder = new ImageBeanHoler();holder.bitmap = bitmap ;holder.imageView = imageView ;holder.path = path ;// 將holder賦值給message.objmessage.obj = holder;// 發送消息mUIHandler.sendMessage(message);}else{// 如果圖片不存在 則添加到任務隊列中addTask(new Runnable(){@Overridepublic void run() {// 加載圖片 TODO}});}} /*** 為了防止錯亂,不能夠直接使用bitmap,因為回調后設置的bitmap已經改變,* 需要將一個圖片所有的屬性(path ,Bitmap ,imageView)再此封裝一下*/private class ImageBeanHoler{public ImageView imageView ;public Bitmap bitmap ;public String path ;} /*** 將任務添加到任務隊列中,然后發送消息通知后臺輪詢線程去任務池中取出一個隊列去執行* @param runnable*/private void addTask(Runnable runnable) {mTaskQueue.add(runnable);mPoolThreadHandler.sendEmptyMessage(0x111);} mPoolThread = new Thread() {@Overridepublic void run() {Looper.prepare();mPoolThreadHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// 線程池從任務隊列中去取出一個任務進行執行mThreadPool.execute(getTask());}};Looper.loop();}};mPoolThread.start(); /*** 從任務隊列中根據圖片加載策略獲取task* @return*/private Runnable getTask() {if(mType == Type.FIFO){// 如果是先進先出的話,則從隊列中移除隊首,獲得隊首去執行,即第一次進來的那個Runnable對象return mTaskQueue.removeFirst();}else if(mType == Type.LIFO){// 如果是后進先出的話,則從隊列中移除隊尾,獲取最后進來的那個Runnable對象去執行return mTaskQueue.removeLast();}return null;}

總結

以上是生活随笔為你收集整理的Imageloader6-mUIHandler的初始化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。