1

インターネットから多数の画像を取得してギャラリーに表示する Android アプリケーションをプログラミングしています。画像は、FragmentStatePagerAdapter に設定された ViewPager 内のフラグメントによってフェッチされる前に、まずディスクに保存されます。

私が抱えている問題は、3 番目の画像がダウンロードされた後、その後の画像で NullPointerException が発生し、URL が明らかに null であることです。私が使用する downloadBitmap() メソッドは次のとおりです。

    static Bitmap downloadBitmap(String url) {
    final AndroidHttpClient client = AndroidHttpClient
            .newInstance("Android");
    final HttpGet getRequest = new HttpGet(url);

    try {
        HttpResponse response = client.execute(getRequest);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != HttpStatus.SC_OK) {
            Log.w("ImageDownloader", "Error " + statusCode
                    + " while retrieving bitmap from " + url);
            return null;
        }

        final HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream inputStream = null;
            try {
                inputStream = entity.getContent();
                final Bitmap bitmap = BitmapFactory
                        .decodeStream(inputStream);
                return bitmap;
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                entity.consumeContent();
            }
        }
    } catch (Exception e) {
        // Could provide a more explicit error message for IOException or
        // IllegalStateException
        getRequest.abort();
        Log.w("ImageDownloader", "Error while retrieving bitmap from "
                + url);
    } finally {
        if (client != null) {
            client.close();
        }
    }
    return null;
}

繰り返しますが、3 番目の画像がダウンロードされた後、メソッドは末尾に URL を追加せずに「ビットマップの取得中にエラーが発生しました」というエラーを吐き出し始めます。これは、null または空の文字列をメソッドに渡していることを意味します。ただし、Log.d("URL", saidURL) を使用してメソッドを実行する直前に渡す URL 文字列をログに記録すると、URL が完全に有効であることが示されるため、これは当てはまりません。downloadBitmap() コードは、次の AsyncTask で呼び出されます。

    class RetrieveImagesTask extends
        AsyncTask<ArrayList<Magazine>, String, ArrayList<Magazine>> {

    @Override
    protected ArrayList<Magazine> doInBackground(
            ArrayList<Magazine>... arg0) {

        Bitmap bitmap;
        for (Magazine mag : arg0[0]) {
            if (!new File(filesDir, mag.ID + ".jpg").exists())
                try {
                    FileOutputStream out = new FileOutputStream(filesDir + mag.ID
                            + ".jpg");
                    Log.d("URL", mag.imageURL);
                    bitmap = downloadBitmap(mag.imageURL);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }
        return arg0[0];
    }

この奇妙な状況に助けはありますか?メモリ不足の問題である可能性がありますか?

4

1 に答える 1

0
static Bitmap downloadBitmap(String url) {
final AndroidHttpClient client = AndroidHttpClient
        .newInstance("Android");
final HttpGet getRequest = new HttpGet(url);

try {
    HttpResponse response = client.execute(getRequest);
    final int statusCode = response.getStatusLine().getStatusCode();
    if (statusCode != HttpStatus.SC_OK) {
        Log.w("ImageDownloader", "Error " + statusCode
                + " while retrieving bitmap from " + url);
        return null;
    }

    final HttpEntity entity = response.getEntity();
    if (entity != null) {
        InputStream inputStream = null;
        try {
            inputStream = entity.getContent();


            final Bitmap bitmap;

 int h = 100; // height in pixels
                int w = 100; // width in pixels
                if (bitmap != null) {
                    bitmap = Bitmap.createScaledBitmap(
                            BitmapFactory
                    .decodeStream(inputStream), h, w, true);

            return bitmap;
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            entity.consumeContent();
        }
    }
} catch (Exception e) {
    // Could provide a more explicit error message for IOException or
    // IllegalStateException
    getRequest.abort();
    Log.w("ImageDownloader", "Error while retrieving bitmap from "
            + url);
} finally {
    if (client != null) {
        client.close();
    }
}
return null;

}

于 2013-02-12T06:32:38.140 に答える