メモリの問題
そのため、上部に 640 x 480 の大きな画像が 1 つと、遅延読み込みされているギャラリーの一部である 3 つの画像がある詳細ビューをページングできるアプリを作成しています。Google のデザイン ガイドラインに従って、これが彼らの提案です。メモリ不足のためにクラッシュする前に、おそらく 12 ~ 13 個のフラグメントをページングできます。この問題にはいくつかの犯人がいると思います。
1.) FragmentStatePager を使用しています。これは、メモリが問題になったときに表示されていないフラグメントを破壊するべきではありませんか? これは起こっていません。自動だと思ってました。これを実現するにはどうすればよいですか? Fragment の実装方法と関係があるのでしょうか? アクティビティの設定はすべて onCreateView で行います。完全を期すために、このソースを含めました。プレーンバニラはこちら:
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
return InventoryDetailFragment.newInstance(position);
}
}
2.) メモリに配置せずに、ダウンロードする必要があるイメージのサイズを把握しようとする方法があります。次に、画像をダウンロードしながら必要なサイズに圧縮します。これはうまく実装されていません。しかし、何がうまくいかないのかわかりません。
private Bitmap downloadBitmap(String url, int width, int height) {
Bitmap bitmap = null;
int scale = 1;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeStream((InputStream)new URL (url).getContent(), null, options);
if (options.outHeight > height || options.outWidth > width) {
scale = (int) Math.max(((options.outHeight)/ height), ((options.outWidth)/ width)); }
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
bitmap = BitmapFactory.decodeStream((InputStream)new URL (url).getContent(), null, o2);
cache.put(url, new SoftReference<Bitmap>(bitmap));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Error e){
Log.d("TEST", "Garbage Collector called!");
System.gc();
}
return bitmap;
}
やり方を知っていることはすべて試しましたが、Android/Java についての私の貧弱な理解を超えています。助けてください!ありがとう!