2011-12-06 6 views
9

を破壊することができません。私はすべてのViewGroupにチャイルズを削除するには、次のコードを使用しています:アンドロイド:活動

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 

どのように私はこの問題を解決することができますか?

答えて

11

エラーログではほとんど説明しています。removeAllViews()AdapterViewにコールしないでください。そしてある時点でのあなたのコードはAdapterViewであるViewGroupを満たしています。

instanceofラップトップtry/catchラッパーを使用して、この例外をチェックまたは処理してください。

+1

AddapterViewがこの操作をサポートしない理由は何ですか? AdapterViewの公式リファレンスで何も見つかりませんでした。 – r1k0

+0

@ r1k0、そうです、それはAdapterViewがその子を内部的に管理するからです。内部状態が壊れる可能性があるため、追加/削除できません。 – inazaruk

0

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

unbindDrawablesというメソッドでこれをやりたがっているのはちょっと分かりませんが、それはちょうどひどく名前が付けられたメソッドではありません。

あなたはこのすべてをonDestroyで呼び出していますか?もしそうなら、これを行うことによって利益が得られるでしょうか?私はシステムがあなたのためにこの種のものを処理するという印象を受けました。

+0

onDestroyコール "liberarMemoria()" と、このコール "unbindDrawables(..)":あなたのコードで、だから、

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

はそのようなことを行います。私は手動でビットマップの破壊を確実にする必要があります。 –

+0

正しいですが、removeAllViewsは必要ではなく、ここで削除するのが安全です – Craigy

0

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

+0

私はビットマップをリサイクルしたいと私は手動で行う必要がありますが、何が最善の方法ですか? –

+0

すべてのソースを見ることなく最良の方法を伝えることはできませんが、 'onDestroy()'でそれを行い、使用されている 'Bitmap'オブジェクトをすべて追跡して' recycle() 'できるようにしてください。 –

7

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

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(); 
} 
関連する問題