Android圖片非同步載入類

來源:互聯網
上載者:User

關鍵字:緩衝池,載入隊列

/** * Title:圖片非同步載入類 * Description: * Copyright:Copyright(c) 2012 * Company: *  * @author tom_liang */package com.zouba.dd.ui.util;import java.io.IOException;import java.io.InputStream;import java.io.Serializable;import java.lang.ref.SoftReference;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.os.Handler;import android.os.Message;public class DandanAsynchImageLoader {public static boolean isStop = false;//是否停止非同步載入圖片線程private static Object locker = new Object();//同步鎖private static Thread loadThread = null;//非同步載入線程對象private static Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();//所有圖片緩衝private static List<AsynchImage> taskQueue = new ArrayList<AsynchImage>();//非同步載入任務的隊列//訊息處理器private static final Handler handler = new Handler() {public void handleMessage(Message message) {//當前任務載入到圖片後,執行回調Bundle bundle = message.getData();AsynchImage asynchImage = (AsynchImage)bundle.getSerializable("handled_task");asynchImage.getCallback().imageLoaded((Drawable) message.obj,asynchImage.getImgURL());}};static {DandanAsynchImageLoader.loadThread = new Thread() {public void run() {while (!DandanAsynchImageLoader.isStop) {synchronized (locker) {if (taskQueue.size() == 0) {try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}}AsynchImage temptask = taskQueue.remove(0);Drawable drawable = loadImageFromUrl(temptask.getImgURL());imageCache.put(temptask.getImgURL(),new SoftReference<Drawable>(drawable));Message message = handler.obtainMessage(0,drawable);Bundle bundle = new Bundle();bundle.putSerializable("handled_task", temptask);message.setData(bundle);handler.sendMessage(message);locker.notifyAll();}}}};//啟動非同步線程(網路事件線程)DandanAsynchImageLoader.loadThread.start();}/** *     非同步載入圖片的靜態方法,首先檢查緩衝裡面是否有之前載入好的圖片 *     有的話直接返回;沒有,加入到非同步任務隊列進行載入 * @param imageUrl網路替片的URL * @param imageCallback回調介面 * @return 返回非同步圖片的Drawable對象 */public static Drawable loadDrawable(final String imageUrl,final ImageCallback imageCallback) {if (imageCache.containsKey(imageUrl)) {SoftReference<Drawable> softReference = imageCache.get(imageUrl);Drawable drawable = softReference.get();if (drawable != null) {return drawable;}}new Thread(){public void run(){synchronized (locker) {if( !taskQueue.contains(imageUrl) ){taskQueue.add(new AsynchImage(imageUrl, imageCallback));}locker.notifyAll();}}}.start();return null;}/** *     網狀圖片載入的回調介面 * @author zouba * */public interface ImageCallback {public void imageLoaded(Drawable imageDrawable, String imageUrl);}/** *     描述:真實的網狀圖片載入方法 * @param url網狀圖片的地址 * @return 返回網狀圖片的Drawable對象 */private static Drawable loadImageFromUrl(String url) {URL m;InputStream i = null;try {m = new URL(url);i = (InputStream) m.getContent();} catch (MalformedURLException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}Drawable d = Drawable.createFromStream(i, "src");return d;}/************************************************************************************* * 非同步載入圖片的Java Bean,對非同步圖片資訊的簡單封裝 *************************************************************************************/static class AsynchImage implements Serializable{private static final long serialVersionUID = 1L;private String imgURL;private ImageCallback callback;public AsynchImage(String imgURL, ImageCallback callback) {this.imgURL = imgURL;this.callback = callback;}public String getImgURL() {return imgURL;}public void setImgURL(String imgURL) {this.imgURL = imgURL;}public ImageCallback getCallback() {return callback;}public void setCallback(ImageCallback callback) {this.callback = callback;}}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.