2

どうしたのみんな。

私は製品カタログを作成しようとしていますが、これが私がやっていることです:

  • 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 でアプリがクラッシュします。

4

2 に答える 2

2

この回答 を見てください
。メモリにキャッシュしている多くの画像をダウンロードして表示する際に同じ問題が発生しました。メモリに残る画像の数が (サイズによって異なります) を超えないようにしてください。

于 2013-05-22T19:58:25.990 に答える
1

コードのどこでアプリがクラッシュしますか?

アプリを閉じた後、「写真」はまだビットマップへの参照を保持していると思います。そのため、GC はビットマップを解放しません。アプリが停止したとき、または新しいビットマップを作成する前に、ビットマップを解放する必要があります。

于 2013-05-22T13:50:03.903 に答える