インターネットから多数の画像を取得してギャラリーに表示する 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];
}
この奇妙な状況に助けはありますか?メモリ不足の問題である可能性がありますか?