たくさんの画像を(インターネットまたはキャッシュから)ダウンロードする必要があります。そのため、画像をキューに入れ、画像がダウンロードされたときに呼び出し元に通知するダウンローダースレッドを作成することにしました。スレッドはキュー内のすべての画像をダウンロードし、さらに画像がダウンロードされるのを待ちます。この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スレッドがハングします。そこで、同期ブロックを削除しましたが、今はを取得しjava.lang.IllegalMonitorStateException: object not locked by thread before notify()
ます。
どうすればこれを解決できますか?