1

たくさんの画像を(インターネットまたはキャッシュから)ダウンロードする必要があります。そのため、画像をキューに入れ、画像がダウンロードされたときに呼び出し元に通知するダウンローダースレッドを作成することにしました。スレッドはキュー内のすべての画像をダウンロードし、さらに画像がダウンロードされるのを待ちます。この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()ます。

どうすればこれを解決できますか?

4

3 に答える 3

1

より良い解決策は、画像のダウンロードを処理するこの素敵なライブラリを使用することです:)

使いやすくオープンソースのユーザー: https ://github.com/nostra13/Android-Universal-Image-Loader

なぜホイールを2回発明するのですか?:)

于 2012-12-11T14:57:39.103 に答える
0

私はこのソースを使用していますhttps://github.com/thest1/LazyList はうまく機能し、画像を非同期でロードします;)

私はあなたを助けたいと思っています

于 2012-12-11T14:53:29.720 に答える
0
  1. notifyAllに変更を通知します。
  2. UI /アクションをクリックすると、新しいスレッドが作成されます...ただし、アクションが新しいスレッドを作成すると、パフォーマンスが低下します...
于 2012-12-11T15:12:24.200 に答える