どうしたのみんな。
私は製品カタログを作成しようとしていますが、これが私がやっていることです:
- ViewPager を使用したアクティビティ -- 各製品は、この ViewPager のフラグメントです。-- 各フラグメントにはギャラリーがあります。
製品データと画像を Web からダウンロードし、画像を SD カードに保存します。
しかし、私のアプリはクラッシュし続け、これがエラーです
05-22 10:04:43.829: E/AndroidRuntime(12388): FATAL EXCEPTION: main
05-22 10:04:43.829: E/AndroidRuntime(12388): java.lang.OutOfMemoryError
05-22 10:04:43.829: E/AndroidRuntime(12388): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
05-22 10:04:43.829: E/AndroidRuntime(12388): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
05-22 10:04:43.829: E/AndroidRuntime(12388): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)
05-22 10:04:43.829: E/AndroidRuntime(12388): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324)
ギャラリーのアダプターの getView 内でビットマップ ファクトリを使用していましたが、フラグメントをスワイプするとクラッシュします。次に、メインアクティビティが作成されたときに変更して作成し、リストを作成しましたが、アクティビティを閉じて再度開こうとするとクラッシュし、再度開こうとすると正常に開きます。
私は何を間違っていますか?それを行うより良い方法はありますか?
これはギャラリーへの私のアダプターです
public class ImagemAdapter extends BaseAdapter {
private Context ctx;
List<Bitmap> pics;
public ImagemAdapter(Context c, List<Bitmap> pics) {
ctx = c;
this.pics = pics;
}
@Override
public int getCount() {
return pics.size();
}
@Override
public Object getItem(int position) {
return pics.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
if(convertView == null){
int arquivoLayout = R.layout.adp_galeria;
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(arquivoLayout, null);
ImageView img = ((ImageView)convertView.findViewById(R.id.imgProd));
img.setImageBitmap(pics.get(position));
}
return convertView;
}
}
別の奇妙なことは、アダプターの convertView が常に null であることです。
編集:
問題は、ビットマップがメモリに保持されることだと思います。フラグメントの onCreateView が呼び出されると、表示する必要がある画像をリストに入力し、フラグメントの onDestroyView が呼び出されると、次のようにします。
for(int i =0; i< imagemBit.size(); i++){
Bitmap bmp = imagemBit.get(i);
bmp.recycle();
bmp = null;
}
imagemBit.clear();
BUT: onCreateView が再度呼び出された (ユーザーが前のページに戻った) ときに、リストを再度入力しようとすると、OutOfMemory Exception でアプリがクラッシュします。