2012-12-10 6 views
1

Java 환경에서의 약한 참조에 대해 알고 싶습니다. 두 주제에 관해서도 약간 읽었습니다. 요약하자면 약한 참조는 이름이 말하는 것처럼 객체에 대한 약한 참조입니다. 즉,이 개체에 대한 참조는 GC에서 쉽게 수집 할 수 있습니다. 약한 참조는 다음과 같이 생성됩니다.약한 참조 및 약한 참조

WeakReference<SomeOtherRef> weakReference = new WeakReference(someOtherRef); 

반면에 약한 참조는 약한 참조보다 훨씬 오래있을 것입니다. 그래서 내 질문은 :

ListView에 대한 사용자 지정 어댑터이 클래스는 모든 기본 ListView 물건을 처리 할 것입니다. 사용자가 내 목록의 항목을 클릭하면 AsyncTask는 시작하라.

convertView.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       LoadCase loadCase = new LoadCase(position, holder); 
       loadCase.execute(""); 

      } 
     }); 

현재로서는 어떤 이유로 progressDialog를 표시하지 않습니다. context 개체입니다. 내 문제는 Activity CustomAdapter 많은 개체를 보유하고 있으며 ProgressDialog,이 것이다 메모리 누수를 일으킬 표시하려면 Activity Context에 대한 참조를 전달해야합니다, 예, 시도했습니다. 이것을 처리하기 위해 Weak/Soft 참조를 적용하는 것이 안전합니까? WeakReference은 언젠가 null 일 수 있습니다. ProgressDialog을 초기화하려고하면 NullPointerException이됩니다.

+1

WeakReferences 또는 대화 상자 나 UI 코드 등을 원한다고 생각하지 않습니다. 이러한 것들은 알려진 수명주기를 가지고 있으며 이와 같이 관리되어야합니다. 일반적으로 lazy initialised cache와 같은 것에 대해서는 WeakReferences를 사용합니다. –

+0

대신 정상적인 강력한 참조를 사용하십시오. –

+0

정상적인 참조를 사용하는 @NeilWightman은 활동이 파괴 된 경우 (예 : 오리엔테이션 변경의 경우) GC가 수집하지 못하게합니다. – Pablo

답변

1

예, 여기서는 WeakReference을 사용하는 것이 좋습니다. 활동이 파괴 될 수 있기 때문입니다. NullPointerException을 피하기 위해 사용할 때마다 null인지 확인해야합니다. null이면 액티비티가 파손되었음을 의미하므로 일반적으로 ProgressDialog을 표시하는 것이 바람직하지 않습니다.

물론 활동이 파괴되어 다시 생성 될 수 있습니다 (예 : 방향 변경 때문). AsyncTask이 오래 걸리면 진행률 표시 줄이 더 이상 표시되지 않을 수 있습니다. 하지만 여기서 문제는 긴 작업에 AsyncTask을 사용하는 것이고 짧은 작업을위한 것입니다.

Activity 클래스의 하위 클래스 인 AsyncTask을 하위 클래스로 지정하면 Activity에 대한 강력한 참조가 있으므로 WeakReference을 사용하면 쓸모가 없습니다.

+0

완벽한 답변 주셔서 감사합니다. AsyncTask 작업은 SQLite DB에서 두 개의 BitMap을로드하는 것입니다. 이것은 1.5 ~ 2.0 초 정도 걸립니다. –