10

次のコードを使用して、すべてのビューグループの子を削除しています。

protected void onDestroy() {
    super.onDestroy();
    this.liberarMemoria();
}

public void liberarMemoria(){
     imagenes.recycleBitmaps(); 
     this.unbindDrawables(findViewById(R.id.RelativeLayout1));
     System.gc();
}
private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
    view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
    for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
        unbindDrawables(((ViewGroup) view).getChildAt(i));
    }
    ((ViewGroup) view).removeAllViews();
    }
}

ここで、ビュー:R.id.RelativeLayout1はListViewです。

しかし、これを行うと例外があります:

E/AndroidRuntime(582): java.lang.RuntimeException: Unable to destroy activity {...}: java.lang.UnsupportedOperationException: removeAllViews() is not supported in AdapterView

どうすればこれを解決できますか?

4

4 に答える 4

11

まあ、エラーログはそれをかなり説明しています: を呼び出さないremoveAllViews()でくださいAdapterView。そして、あなたのコードはある時点でそれを満たしViewGroupていAdapterViewます.

/ラッパーを使用してinstanceofチェックまたはハンドル例外を使用して、このケースを除外してください。trycatch

于 2011-12-06T19:25:13.013 に答える
7

ViewGroup が AdapterView のインスタンスでないかどうかを確認します。

そのようなことをしてください:

if (!(view instanceof AdapterView<?>))
    ((ViewGroup) view).removeAllViews();

だから、あなたのコードで:

if (view instanceof ViewGroup) {
    for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
        unbindDrawables(((ViewGroup) view).getChildAt(i));
    }
    if (!(view instanceof AdapterView<?>))
        ((ViewGroup) view).removeAllViews();
}
于 2013-01-24T12:48:22.987 に答える
0

その行を削除しますか?または、少なくとも操作がtryおよびでサポートされているかどうかを確認してくださいcatch

また、 という名前のメソッドでこれを行うのは少し混乱しますunbindDrawables。ただし、それが名前の悪いメソッドである場合を除きます (それが何をするかを完全に説明していません)。

このすべてを で呼び出していますonDestroyか? もしそうなら、これを行うメリットはありますか?システムがこの種のことを処理してくれるという印象を受けました。

于 2011-12-06T19:24:35.823 に答える
0

呼ばないで。UnsupportedOperationException は、このメソッドがサポートされていないか機能していないことを示しているため、別の方法でタスクを実行する必要があります。ガベージコレクターがこのタスクを処理するため、とにかくこれを呼び出す必要はありません。確実に行う必要がある場合は、ビットマップのリサイクルを手動で行う必要があります。

于 2011-12-06T19:29:52.680 に答える