2016-09-07 1 views
0

예를 들어, 아래와 같이 조각 안에 TextView를 추가했습니다.활동을 파기하는 동안 조각에서 사용 된 리소스를 지우는 방법은 무엇입니까?

 var adaptor = new GenericFragmentPagerAdaptor(SupportFragmentManager); // where GenericFragementPagerAdaptor is a sub-class derived from FragementPagerAdaptor 

     adaptor.AddFragmentView((i, v, b) => { 
      var view = i.Inflate(Resource.Layout.tab, v, false); 
      textView = new TextView(view.Context); 
      textView.Text = "Test1"; 
      view.FindViewById<FrameLayout>(Resource.Id.mainFrame).AddView(textView); 
      return view; 

나는 현재 활동을 의미 cleared.Where 내가 그것을 어떻게 할 수 있어야한다 조각에 관련된 모든 자원을 파괴하고 있다면? 제발, 누구든지 나를 제안합니다. 활동을 (들의 OnDestroy()), 조각의 수명주기 방법 onDestroyView()와 onDetach() 파괴하기 전에

+0

C#으로 더 이상 필요하지 않을 때 해제해야하는 다른 리소스와 어떻게 다른가요? (C#이라고 가정 함)? 이러한 유스 케이스는 IDisposable을 구현하고'using' 블록에서 사용하고 적절한 소멸자를 제공함으로써 클래스를 작성함으로써 해결됩니다. –

+0

조각 안에 사용 된보기가 여기에있는 리소스라는 것을 의미합니다. IDisposable을 구현하여 시도했지만 작동하지 않았습니다. – Divakar

+0

"작동하지 않음"은 매우 구체적이지 않으며 코드를 제공하지 않습니다.아마도 Sachin의 충고 (아마도 라이프 사이클 상태가 바뀔 때 클래스가 제공하는 콜백/이벤트를 사용하는 것)가 적절할 것입니다. "Dispose()"메소드를 구현할 수 있습니다. "프래그먼트와 관련된 자원을 지 웁니다." 그것들 (여기에있는 견해)과 무엇이든 "개간"이 수반합니다. 물론'Dispose()'함수는 명시 적으로 또는 암시 적으로'using' 블록의 끝에서 호출되어야합니다. 정확하게 작동하지 않은 것은 무엇입니까? –

답변

1

감사합니다,

가 호출됩니다.

onDestroyView() 조각이 뷰가 소멸되어 관련 리소스를 정리할 수 있음을 알립니다.

내 제안은이 예제를 다운로드하고 조각의 모든 수명주기 방법을 탐색하는 것입니다.

https://github.com/SilverBayTech/FragmentLifeCycle.

추가 도움이 필요하면 도움을 주시면 감사하겠습니다.

UI가있는 조각에서는 액세스 속도를 높이기 위해 일부보기를 인스턴스 상태로 저장하는 경우가 있습니다. 예를 들어 EditText에 대한 링크를 통해 항상 FindViewById를 찾을 필요가 없습니다.

문제는보기가 활동 컨텍스트에 대한 참조를 유지한다는 것입니다. 이제 뷰를 유지하면 해당 컨텍스트에 대한 참조도 유지됩니다.

컨텍스트가 여전히 유효하지만 일반적인 보유 사례가 활동을 다시 시작하는 경우에도 문제가 없습니다. 매우 자주 예를 들어 화면 회전합니다. 액티비티 레크리에이션은 새로운 컨텍스트를 만들고 오래된 컨텍스트는 가비지 수집을위한 것입니다. 그러나 조각에 이전 참조가 여전히 있으므로 가비지 수집이 불가능합니다. 예를 들어 다음

공용 클래스 LeakyFragment이 조각 {

private View mLeak; // retained 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mLeak = inflater.inflate(R.layout.whatever, container, false); 
    return mLeak; 
} 

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    // not cleaning up. 
} 

}

가 그 문제를 제거하기를 확장 그것을 어떻게하지 보여줍니다, 당신은 당신의 UI에 대한 모든 참조를 삭제해야 onDestroyView에서. Fragment 인스턴스가 다시 사용되면 onCreateView에 새 UI를 생성하라는 메시지가 표시됩니다. onDestroyView 다음에 UI를 유지할 필요도 없습니다. Ui는 사용되지 않을 것입니다.

이 예제의 수정 사항은 onDestroyView() 메서드를 변경하는 것입니다. (이 응용 프로그램 컨텍스트 않는 한) 또는 문맥 -

@Override 
public void onDestroyView(){ 
    super.onDestroyView(); 
    mLeak = null; // now cleaning up! 
} 

그리고 당신은 분명 (onDetach에 깨끗한 예를 들어, onAttach에서) 활동에 대한 참조를 유지하지 않아야 뷰에 대한 참조를 유지 외에

.

+0

샘플을 분석했지만 얻지 못했습니다. 보기가 파손되는 조각을 친밀하게하는 방법을 알려주십시오. – Divakar

+0

간단한 답을 제시하여 답을 편집했습니다. 그 점을 참고하십시오. 이 예가 당신의 의심을 없애 준다는 것을 알려주십시오. –

관련 문제