0

メモリ不足エラーが発生します。DDMS を確認したところ、より多くのメモリを割り当てる場所がアダプターの getView() メソッドにあることがわかりました。この方法よりもオブジェクトを作成する方が良い方法ですか:

view=new ImageView(myContext);

これは私の getView() メソッドの一例です:

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView==null){
        view=new ImageView(myContext);
        view.setLayoutParams( new AbsListView.LayoutParams(columnWidth,columnWidth));
        view.setBackgroundColor(Color.GRAY);
    }else{
        view=convertView;
        convertView.setBackgroundColor(Color.GRAY);
    }
    return view;
}

c'tor でコンテキストを取得します。

public emptySquaresAdapter( Context myContext,) {
    super();
    this.myContext=myContext;
}

コンテキストリークについて読みましたが、そうですか?

編集:

この場合、画面内のすべてのビューを一度に表示するので、変換されたビューは使用されません (さらにビューを表示するためにスクロールする必要はありません)。

このアダプターは、画面に 12 個の正方形を表示します。メソッド getView は、位置 0 で 12 回呼び出され (すべての子 Vie を測定すると思います)、1,2,3 の位置に移動し続けます...なぜそれが起こるのですか? これで OOM の問題が発生する可能性はありますか? このアダプターを別のアダプターから呼び出しますが、それがすべてを複雑にしていると思います。

また、onDestroy ですべてのドローアブルのバインドを解除し、imageView.getDrawable().setCallback(null) をすべての imageViewsIt に設定します。

4

3 に答える 3

1

アクティビティ コンテキスト (たとえば) ではなくApplicationコンテキスト ( )を渡すようにする必要があります。コンテキストを使用すると、バインドされているオブジェクト (実装内) がガベージ コレクションされず、メモリ リークと OutOfMemory が発生するため、メモリ リークが発生する可能性があるためです。例外。getApplicationContext()thisActivityview

避けるべきもう 1 つのことは、呼び出されるViewたびに新しい を作成することgetView()です。convertViewスクロール後に表示される行の新しいビューとして使用される再利用されたビュー (スクロール時にポップアウトされるビュー) ですView。呼び出しごとにオブジェクトを作成する代わりに使用しviewます (GC がオブジェクトを収集しても Outofmemory 例外は発生しませんが、GC の実行時にスクロールが遅くなる可能性があります)。

于 2012-12-13T15:08:39.830 に答える
0

最初にを割り当てることはありませんconvertView。したがって、getView()が呼び出されるたびに、新しいものを作成しますImageView

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView==null){
        convertView=new ImageView(myContext);
        convertView.setLayoutParams( new AbsListView.LayoutParams(columnWidth,columnWidth));
        convertView.setBackgroundColor(Color.GRAY);
    }else{

        convertView.setBackgroundColor(Color.GRAY);
    }
    return convertView;
}
于 2012-12-13T15:05:41.867 に答える