Попытка понять следующее AyncImageLoader - PullRequest
0 голосов
/ 04 января 2012
import java.lang.ref.SoftReference;
import java.util.HashMap;

 import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;


public class AsyncImageLoader {
private HashMap<String, SoftReference<Drawable>> imageCache;
HashMap<String, SoftReference<Drawable>> drawableMap = new HashMap<String,    SoftReference<Drawable>>();


public AsyncImageLoader() {
    //HashMap<String, SoftReference<Drawable>> drawableMap = new HashMap<String, SoftReference<Drawable>>();
}

public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {

    if (drawableMap.containsKey(imageUrl)) {
        SoftReference<Drawable> softReference = imageCache.get(imageUrl);
        Drawable drawable = softReference.get();
        if (drawable != null) {
            return drawable;
        }
    }
    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message message) {
            imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
        }
    };

    //this is the new thread that download the image from url
    new Thread() {
        @Override
        public void run() {
            Drawable drawable = loadImageFromUrl(imageUrl);
            imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
            Message message = handler.obtainMessage(0, drawable);
            handler.sendMessage(message);
        }
    }.start();
    return null;
}

public static Drawable loadImageFromUrl(String url) {
    return null;
    // ...
}

public interface ImageCallback {
    public void imageLoaded(Drawable imageDrawable, String imageUrl);
}

}

ОК, мое понимание таково:
1) Проверьте, есть ли изображение в кеше, если оно потом вернет нарисованное;2) Если нет, то создайте новый обработчик для отправки сообщения в поток пользовательского интерфейса с Drawable в качестве объекта, и этот обработчик не будет отправлять, пока не будет вызвана загруженная функция обратного вызова. 3) создайте новый поток, чтобы инициировать загрузку изображения из URL.

4) в частности, последовательность для обработчика происходит в следующем порядке: A) Message message = handler.obtainMessage (0, drawable);B) public void handleMessage (Message message) {imageCallback.imageLoaded ((Drawable) message.obj, imageUrl);} C) handler.sendMessage (message);

У меня проблема с номером 4, мне неясно, получить сообщение (0, рисуется)?получить откуда?где источник?Как я знаю, откуда это, поток пользовательского интерфейса или другие?Таким образом, после получения этого сообщения обработчик сообщения выполняет обратный вызов.public void handleMessage (Message message) {imageCallback.imageLoaded ((Drawable) message.obj, imageUrl);}

наконец он отправляет сообщение с drawable в качестве полезной нагрузки.handler.sendMessage (сообщение);но откуда мне знать, куда его отправлять?Всегда ли в качестве конечного пункта используется поток пользовательского интерфейса?

спасибо

1 Ответ

3 голосов
/ 04 января 2012

в основном - здесь есть два потока: основной поток пользовательского интерфейса, в котором выполняется большая часть этого кода, и поток загрузки, определенный внизу.

вызов receiveMessage просто возвращает объект сообщения из пула, что дешевле, чем создание нового.В этом использовании он аналогичен конструктору.

, поскольку обработчик определен в потоке пользовательского интерфейса, метод handleMessage также выполняется в потоке пользовательского интерфейса.Само сообщение - это просто способ получить отрисовку из потока загрузки в поток пользовательского интерфейса, а также вызвать обратный вызов, когда загрузка завершится.

Таким образом, в основном весь этот код делает:drawable существует в кеше (SoftReference), затем возвращает его.В противном случае, получите ссылку на обработчик и запустите поток, который загружает отрисовку.Когда этот поток завершает загрузку, он создает сообщение и отправляет его обработчику, который, в свою очередь, вызывает imageCallback.imageLoaded и передает вновь загруженный чертеж.

...