0

나는 아주 기본적인 질문이있다. 아래 코드에서 이미 초기화 된 URL 애셋이있는 VideoView를 아래의 AsyncTask에 전달하는 것이 목적입니다. 작업은 비디오를 시작하고 진행 상황을 추적합니다. 지금까지 progressPercentage를 올바르게 인쇄하고 100 %에 도달하면 루프에서 빠져 나옵니다. 그러나 재생 중에 "뒤로"를 누르거나 VideoView를 호스팅하는 Activity를 종료하면이 AsyncTask가 무한히 실행됩니다. 어떻게 이런 일이 일어나지 않도록 할 수 있습니까? 나는 "현재"값을 "prev_current"값과 비교할 것을 고려했다. 그러나 사용자가 FF 나 RW를 비디오의 특정 지점으로 결정하면이 작업을 종료하지 않을 것이다.AsyncTask가 특정 코드를 실행하는 것을 막는 방법 무한히

public class VideoPlayerProgressAsyncTask extends AsyncTask<Void, Integer, Void>{ 
    private VideoView video; 

    private int duration = 0;   // in milliseconds 
    private int current = 0;   // in milliseconds 
    private int progressPercentage = 0; // range [0..100] 

    public VideoPlayerProgressAsyncTask(VideoView vid) { 
     video = vid; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     video.start(); 
     video.requestFocus(); 
     video.setOnPreparedListener(new OnPreparedListener(){ 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       duration = video.getDuration(); 
      } 
     }); 

     while(progressPercentage <= 100)  { 
      current = video.getCurrentPosition(); // in milliseconds 

      try{ 
       int temp = (int) (current * 100/duration); 
       publishProgress(temp); 
       if(progressPercentage >= 100) 
        break; 
      } 
      catch(Exception e){   } 
     } 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     progressPercentage = values[0]; 
    } 
} 
+0

멈출 것이다. 이 : @Override 같은 코드를 정의해야합니다 \t 공공 무효 onPause() { \t \t \t super.onPause을() 스텁 \t // TODO 자동 생성 방법; \t \t asynctask.cancel (true); \t} –

답변

1

시도는 활동의 onPause에 AsyncTask를()을 취소

내가 생각하는 것보다 당신이 Onpause() 이벤트에 귀하의 취소 AsyncTask를 코드를 정의하는 것보다 당신이 버튼을 누르거나 종료 활동을 다시 눌러
@Override 
protected void onPause() { 
    videoPlayerProgressAsyncTask_Object.cancel(true); 
}