2010-04-19 4 views
1

버튼이있는 간단한 테스트 애플리케이션을 함께 치고 사용자가 클릭 할 때 소리가납니다. 이 while 루프에서처럼안드로이드 SDK의 애플리케이션 라이프 사이클 및 onCreate 메소드

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button b = (Button)findViewById(R.id.easy); 
    b.setOnClickListener(this); 
} 

public void onClick(View v) { 
    MediaPlayer mp = MediaPlayer.create(this, R.raw.easy); 
    mp.start(); 
    while(true) { 
     if (!mp.isPlaying()) { 
      mp.release(); 
      break; 
     } 
    } 
} 

내 질문은, 왜에서 onCreate 역할을한다 : 여기 방법입니다입니까? 나는 언제든지 버튼을 클릭 할 수 있으며 소리를 낸다. 아마 청취자의 속성이라고 생각할 수도 있지만 Button 객체는 멤버 변수가 아닙니다. 나는 안드로이드가 onse를 작성하고 다음 라이프 사이클 방법으로 진행할 것이라고 생각했다.

또한 사운드를 재생하는지 보는 현재의 방식은 쓰레기입니다 ... 나중에 알게 될 것입니다. :)

고맙습니다.

답변

1

프레임 워크가 생성 한보기에있는 인스턴스와 대조적으로 작성한 코드 측면에서 단추 인스턴스를 생각해보십시오. 귀하의 버튼 변수 (b)는 단순히 그것에 대한 참조입니다. onCreate 메소드가 범위를 벗어나면 버튼의 레퍼런스가 더 이상 존재하지 않지만 UI에는 버튼이 계속 존재합니다. 당신의 레퍼런스는 청취자 메쏘드를 첨부하기에 충분히 길었기 때문에, 버튼의 수명 동안 (onCreate가오고 갔을 때 여전히 UI에서 보았던) 버튼이 보이지 않을 때 더 많이 연관되어 있습니다 당신이 만든 변수의 범위.

Btw ... 방금 시작 했으므로 MediaPlayer 코드가 함께 던져 졌음을 알고 있습니다. 그러나 나중에 참조 할 때 while 루프가 필요하지 않습니다. MediaPlayer를 당신에게 onCompletionListener 콜백 제공 :

OnCompletionListener

+1

그것은 "당신이 while 루프를 필요가 없다"고 아니에요을 - 루프가 기본 응용 프로그램 스레드를 묶어 반면, 결국 원인 사용자 인터페이스를 동결 것을 가지고 너의 활동을 죽일 안드로이드. – CommonsWare

+0

아, 고맙습니다. :) 어쨌든, 포인터를 제거했지만 개체 자체는 아니며 UI가 버튼, JVM (또는 JVM의 안드로이드 버전이라고하는 것이 무엇이든)에 대한 참조를 유지하기 때문에, 그것 주위에. 이 경우 버튼이 앱이 닫힐 때까지 지속되거나 활동이 종료 될 때까지 지속될 것입니다 (또는 화면에서 사라질 때까지). 다시 고마워. –

+0

버튼의 수명은 해당 변수를 가리키는 변수의 수명과 같다고 생각하면됩니다. UI를 구성한 Android 프레임 워크 내의 메커니즘 (이 경우 만든 XML 파일에서 객체 그래프를 작성하고 화면에 표시)은 생성 된 객체의 라이프 사이클을 제어합니다. 이 경우 액티비티가 소유하므로 액티비티는 볼 수있는 한 범위 내에 있다고 상상합니다. 마찬가지로 리스너 객체는 참조가있는 한 범위 내에 있습니다. – Rich

관련 문제