2011-11-10 3 views
5

다음 Activity로 이동하기 전에 실행되는 AsyncTask가 있습니다. 이 AsyncTask 안에는 MediaPlayer가 있습니다.onPause 후에 AsyncTasks는 어떻게됩니까?

protected void onPause() { 
      stopProgress(); 
      Log.i(TAG, "onPAUSE"); 
      try { 
      } finally { 
      // If we allocated a player, then cleanup after it 
      if (player != null) { 
       player.reset(); 
       player.release(); 
       player = null; 
       Log.d(TAG,"end of player cleanup"); 
          } 
      } 
      super.onPause(); 
     } 

사용 시나리오 : 플레이어도로드되기 전에 1

  • 이동 활동 2에 활동에

    1. 클릭 재생 버튼 (onPause에서 로그 정보를 확실히이라고합니다).
    2. 활동 2에있는 동안로드가 완료되면 활동 1의 플레이어가 재생됩니다.
  • 답변

    3

    AsyncTask에 아무 것도 일어나지 않아야합니다. 그것은 계속 실행됩니다. 그러나 이것은 백그라운드에서 미디어 플레이어를 실행하는 좋은 방법은 아닙니다 (서비스를 사용하십시오). 코드가 미디어 플레이어를 취소하지만 AsyncTask에있는 내용에 따라 여전히 활성 상태 일 수 있습니다. 작업에서 cancel (boolean mayInterruptIfRunning)을 호출하여 AsyncTask가 종료되도록 할 수 있습니다. 당신의 MediaPlayer 객체가 여전히 위의 코드를 사용하여 실행 어떤 이유 경우

    , 다음 AsyncTask.cancel(true)를 호출 void onCancelled (Result result)을 무시하고 다음 스레드 내에서 MediaPlayer을 죽인다. onCancelleddoInBackground 후에 만 ​​호출됩니다 (또는 cancel()이 스레드에 있는지 확인하기 위해 주기적으로 isCancelled()을 확인할 수 있음). cancel(true)을 설정하면 doInBackground이 완료 될 때까지 기다리지 않아도 될 것이라고 생각합니다. 물론 그렇습니다.

    1

    당신이 AsyncTask에서 무엇을하고 있는지 정확히 알지 못하지만, 심지어 무엇이든지 계속 진행해야합니다. onPause()이 호출됩니다. onDestroy()이 호출되었고 Activity에 AsyncTask 참조 항목이 있으면 AsycnTask가 기본적으로 null 포인터 예외를 throw하기 시작하기 때문에 문제가 발생합니다.

    +0

    사실, 작업에서 나는 player = new MediaPlayer() .... duh :) – hunterp

    +1

    을 설정하고 있습니다. onDestroy()가 호출되면 비동기 작업이 취소되어야합니다. –

    관련 문제