2011-12-06 6 views
9
나는 모든 뷰 그룹에 차일을 제거하려면 다음 코드를 사용하고

을 파괴 할 수 없습니다 :안드로이드 : 활동

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

글쎄, 오류 로그는 거의 그것을 설명합니다 : AdapterViewremoveAllViews()을 호출하지 마십시오. 그리고 어떤 점에서 코드는 AdapterViewViewGroup을 충족합니다.

이 케이스는 instanceof을 사용하여 확인하거나 예외 처리를 try/catch 래퍼로 예외 처리합니다.

+1

AddapterView가이 작업을 지원하지 않는 이유는 무엇입니까? 나는 그것에 대해 AdapterView의 공식 참조에서 아무것도 찾을 수 없습니다. – r1k0

+0

@ r1k0 예, AdapterView는 내부적으로 자식을 관리하기 때문입니다. 내부 상태가 손상 될 수 있으므로 추가/제거 할 수 없습니다. – inazaruk

0

해당 행을 삭제 하시겠습니까? 또는 최소한 trycatch으로 작업이 지원되는지 확인하십시오.

unbindDrawables라는 메서드에서이 작업을 전혀 수행하지 않으려 고 혼란을 빚고 있습니다.이 메서드는 잘못 명명 된 메서드 일 뿐이지 만 완전히 설명하지는 않습니다.

이 모든 것을 onDestroy에 신고 하시겠습니까? 그렇다면 이것을하는 것이 도움이됩니까? 나는 그 시스템이 당신을 위해 이런 종류의 일을 처리한다는 인상 아래있었습니다.

+0

는 "liberarMemoria()"이 호출 "unbindDrawables (..)"을 호출들의 OnDestroy. 나는 비트 맵을 파괴하기 위해 수동으로해야만한다. –

+0

오른쪽 ... 'removeAllViews'는 필요 없으며 여기서 안전하게 제거 할 수 있습니다 – Craigy

0

전화하지 마세요. UnsupportedOperationException은이 메소드가 지원되지 않거나 기능적이지 않으므로 다른 방법으로 작업을 완료해야 함을 알려줍니다. 가비지 컬렉터가이 작업을 처리 할 때 이것을 호출 할 필요는 없습니다. 비트 맵 리사이클을 수행해야하는 경우 수동으로 수행해야합니다.

+0

Bitmap을 재활용하고 싶지만 수동으로해야하지만 가장 좋은 방법은 무엇입니까? –

+0

모든 소스를 보지 않고 가장 좋은 방법을 말할 수는 없지만'onDestroy()'에서 그것을 사용하고 사용 된 모든'Bitmap' 객체를 추적하여'recycle()'할 수 있어야합니다. –

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(); 
}