2010-03-01 3 views
28

일부 외부 데이터의 실행 그래프를 표시하는 활동에 많은 코드가 있습니다. 이 새로운 LinearLayout 유도 된 클래스로 물건을 이동ViewGroup 파생 클래스에서 라이프 사이클을 관리하는 방법은 무엇입니까?

public class GraphView extends LinearLayout { 
    public GraphView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     LayoutInflater inflater = (LayoutInflater) 
       context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     inflater.inflate(R.layout.graph_view, this, true); 
    } 

    public void start() { 
     // Perform initialization (bindings, timers, etc) here 
    } 

    public void stop() { 
     // Unbind, destroy timers, yadda yadda 
    } 
     . 
     . 
     . 
} 

은 간단했다 : 활동 코드가 복잡의 종류를 얻고 있었다, 나는이 코드를 추출하고 GraphView 클래스를 생성하기로 결정했다. 그러나이 그래프에서 사용 된 타이머 및 이벤트 리스너를 생성 및 파기하는 것과 관련된 라이프 사이클 관리 코드가있었습니다 (예 : 활동이 일시 중지 된 경우 백그라운드에서이 폴링을 원하지 않았습니다).

MS Windows 배경에서 볼 때, 우선 덮어 쓸 수있는 onCreate()onDestroy() 메서드 또는 비슷한 것을 찾을 것으로 예상되지만, LinearLayout (또는 상속 된 멤버 중 하나)의 정렬을 찾지 못했습니다. 이 초기화 코드를 모두 Activity에두고 작업을 뷰로 전달해야하는 것은이 코드를 모두 재사용 가능한보기로 캡슐화한다는 원래의 목적을 뛰어 넘은 것처럼 보였습니다.

내보기에 두 개의 추가 공개 방법 인 start()stop()이 추가되었습니다. 활동의 onResume()onPause() 메소드에서 각각 호출합니다.

이것은 작동하는 것처럼 보이지만 여기서 덕트 테이프를 사용하고있는 것처럼 느껴집니다. 누구나 이것이 일반적으로 어떻게 수행되는지 알고 있습니까? 뭔가 놓치고있는 것처럼 느껴집니다 ...

+0

오늘 나는 나 자신에게 같은 질문을했다. :) –

답변

20

protected void onAttachedToWindow()protected void onDetachedFromWindow()을 무시한 적이 있습니다. 시도한 적이 없지만 원하는 경우 대략 호출 할 수 있습니다.

2
불행히도 View 객체는 백그라운드 및 활성 모드에서 이동할 때 Activity로 콜백 메서드를 가지지 않습니다.

어쨌든, 당신이 그런 접근법을 고집한다면 가장 가까운 것은 init 코드를 생성자에 넣고 destruct 코드를 finalize()의 오버라이드에 넣는 것입니다. 하지만 finalize() 메서드는 객체가 더 이상 참조되지 않을 때 시스템에서 실행되어 가비지 수집 준비를합니다. vm이 종료되면 전혀 호출되지 않을 수 있습니다. 그리고 나는이 방법을 추천하지 않을 것이다.

또한 짧은 수명의 개체가 메모리 누수를 유발할 때 앱이 일시 중지되고 다시 시작될 때 GraphView 개체를 반복 작성하고 파괴하고 싶지는 않습니다. gc가 이러한 객체에 대한 메모리를 해제 할 때조차도 알지 못한다.

start() 및 stop() 메소드를 사용하는 approrach는 괜찮 았다고 생각합니다. 간단하고 깨끗하게 유지하십시오. AsyncTasks (또는 Timer 객체)를 유지 관리하면됩니다.

(오프 주제 당신이 당신의 의견을 팽창 방법에 관한 : 나는 View.inflate을 (사용)가 몇 줄의 코드 저를 저장 주로로) 당신은 밖으로 약간의 사용을받을 수 있습니다

+0

+1 for View.inflate() –

6

나는 단지이 짧은 실험을 한 적이 있지만, 위의 최우선

protected void onWindowVisibilityChanged(int visibility)

과 함께 CaseyB 언급대로 onAttachedToWindowonDetachedFromWindow을 무시할 경우 그것은 당신에게 필요한 정보를 제공해야한다 나타납니다 .

나는 당신과 같은 상황에 처해있다. 나는 거기에 대한 알림 메커니즘이 놀랍군요.

관련 문제