5

サーバーから画像をダウンロードしてリストビューに表示するアプリケーションを作成しようとしています。私が起こした問題は、メモリのリークであり、アプリケーションがクラッシュしました。このリンクなどのAndroidブログで検索していましたが、素晴らしいアイデアを示していますが、複数のスレッドでそれを行うにはまだ十分ではありません。Android の一部のデバイスはそれで動作しますが、一部のデバイスはシングル スレッドでしか処理できず、まったく動作しない場合があります。

私のアプリケーションには多くのアクティビティがあり、それぞれにできるだけ早く画像を表示する必要がある Listview があります。Google IO 2012 を通じて、バッファを使用して元の画像を SD カードに保存し、メモリ リークの問題を解決しますが、ダウンロードする必要がある画像が大きすぎるため、読み込みが非常に遅くなります。

私の質問は次のとおりです。SD カードへのイメージの書き込みと一緒にイメージをスケーリングする方法はありますか? 入力ストリームオブジェクトでスキップバイトを使用することで解決できる可能性があることがわかり、ダウンロードする必要がある画像のピクセルあたりの幅と高さを見つけることができました。

次のコードは Google IO 2012 で使用され、複数のスレッドでうまく機能します。私の場合、バックグラウンドで 4 つのスレッドが実行されています。

private void downloadAndWriteFile(final String url, final File file) throws OutOfMemoryError {
    BufferedOutputStream out = null;

    try {
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setDoInput(true);
        conn.connect();

        final InputStream in = new BufferedInputStream(conn.getInputStream(), IO_BUFFER_SIZE_BYTES);    // buffer size 1KB
        out = new BufferedOutputStream(new FileOutputStream(file), IO_BUFFER_SIZE_BYTES);

        int b;
        while ((b = in.read()) != -1) {
            out.write(b);
        }
        out.close();
        conn.disconnect();
    }
    catch (Exception e) {
        Log.e(TAG, "!!downloadAndWriteFile " + e.getMessage());
        file.delete();
    }
}
4

3 に答える 3