java - 同步:ImageDownloader线程

标签 java android synchronization

我需要下载(从 Internet 或我的缓存中)很多 图像。因此,我决定创建一个下载程序线程,将图像排入队列并在下载图像时通知调用者。 该线程下载队列中的所有图像,并等待下载更多图像。在 add 方法中,我唤醒线程再次开始下载:

public class ImageDownloader implements Runnable {

private boolean continueFetching;
private List<Image> images;

private static ImageDownloader instance = new ImageDownloader();

private ImageDownloader() {
    continueFetching = true;
    images = new ArrayList<Image>();

    new Thread(this).start();
}

public static ImageDownloader getInstance() {
    return instance;
}

@Override
public void run() {
    synchronized (this) {
        while (continueFetching) {
            fetchAvailableImages();
            try {
                this.wait();
            } catch (InterruptedException e) {
            }
        }
    }
}

private void fetchAvailableImages() {
    while (images.size() != 0) {
        Image image = images.get(0);

                    Bitmap bitmap = downloadImage(image);
                    image.onImageDownloadCompleteListener.onImageDownloadComplete(bitmap);

        images.remove(0);
    }
}

public void stop() {
    synchronized (this) {
        continueFetching = false;
        notify();
    }
}

public void add(Image image) {
    images.add(image);
            notify;
}

public interface OnImageDownloadCompleteListener {

    public void onImageDownloadComplete(Bitmap bitmap);
}
}

当我同步 add 方法时,UI 线程挂起,因为它需要等待当前图像下载完成。 所以我删除了同步块(synchronized block),但现在我得到了 java.lang.IllegalMonitorStateException: object not locked by thread before notify()

我该如何解决这个问题?

最佳答案

更好的解决方案是使用这个不错的库来为您处理图像下载:)

用户易于使用且开源: https://github.com/nostra13/Android-Universal-Image-Loader

为什么要发明两次轮子? :)

关于java - 同步:ImageDownloader线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821881/

相关文章:

java - 不同风格的递归,引用/全局/指针变量的使用

java - 在弹出元素时将堆栈打印到控制台会不确定地抛出异常

java - Java中监视器重新获得的顺序

java - 同步块(synchronized block)如何工作?

java - 在单个线程中处理多个无限任务? P.S 一次运行一个任务并从外部控制其任务行为(即启动/停止任务)

JavaFx 空组合框

java - 如果用户没有值,则在 JSP 中显示代码 - <c :choose> not working

android - Realm 查找查询结果为空对象

android - 修饰符工厂函数不应标记为@Composable

android - startactivity() 不适用于扩展 ListActivity 的内部类