Imageloader6-mUIHandler的初始化
生活随笔
收集整理的這篇文章主要介紹了
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的初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shell-通过shell启动Java类
- 下一篇: ListView使用技巧-更新中