마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

asynctask에서 Cancel()실행 했는데 onCancelled호출이 안될때 [closed]

0 추천

asynctask에서 Thread를 돌리면서 중지버튼 클릭 이벤트에 Cancel(true)를 실행하였습니다.

실행후 isCancelled()에서는 정상적으로 true가 반환되서 돌아오는데,

Thread 중지 후 작업을 주려고 onCancelled메소드를 오버라이드 해서 구현 했습니다.

근데 onCancelled 메서드가 호출이 안되더라구요.. 질문 올리기 전에 구글링을 통해 좀 알아 봤습니다만,,

명확한 답을 찾기가 어려워 도움을 청합니다..

cancel 실행 부분과 onCancelled 는 아래와 같이 구현해 테스트중입니다.

 

@Override
protected void onPreExecute() {
progressBar = new ProgressDialog(dContext);
 
progressBar.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.erase_dtc_stop), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
LogUtil.d("중지");
 
eraseDtcTask.cancel(true);
System.out.println(eraseDtcTask.isCancelled() + " : isCancelled");
}
});
 
progressBar.setCancelable(false);
progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressBar.setMessage(getString(R.string.erase_dtc_wait));
 
super.onPreExecute();
}
 
@Override
protected void onCancelled(Boolean result) {
System.out.println("called cancel");
publishProgress("PROGRESS_BAR_CHANGE", "중지중..");
 
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
 
progressBar.dismiss();
publishProgress("NOTICE", "중지 완료");
}

 

질문을 종료한 이유: 자체해결
익명사용자 님이 2014년 6월 25일 질문
2014년 6월 25일 closed
cancel()이 작업중지를 요청하는 것은 맞지만 즉각 중지하지는 않습니다.
혹시 이렇게 시도해 보셨는지요..

public class MyTask extends AsyncTask<String, String, Boolean> {
  private Boolean result;
  // . . .
  @Override
  protected void onCancelled() {
    handleOnCancelled(this.result);
  }
  @Override
  protected void onCancelled(Boolean result) {
    handleOnCancelled(result);
  }
  private void handleCancelled(Boolean result) {
    // 중지 완료!
  }
}
onPreExecute() 함수는 Thread로 동작하지 않고, Main Thread에서 동작하는 부분이라서 본문에 넣어 주신 코드 같은 경우는 AsyncTask execute 하는 경우 정상적으로 처리 되었다는 onPostExecure() 콜백 함수가 호출이 됩니다.

AsyncTask 의 경우 doInBackground() 콜백 함수가 Thread에서 동작하는 부분이며, doInBackground() 가 동작 중에 AsyncTask cancel을 하는 경우  doInBackground() 함수 로직이 완료 된 뒤에 onCancelled() 콜백이 호출이 되도록 되어 있습니다.
AsyncTask cancel 을 호출 하지 않은 경우에는 doInBackground() 함수 로직 완료 후 onPostExecure() 콜백이 호출이 되구요.

@Override
protected Void doInBackground(Void... params) {
    int count = 0;
    while( !isCancelled() && count < 10 ) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ++count;
    }
            return null;
}

AsyncTask에서 위와 같이 doInBackground 를 오버라이드를 하시면 캔슬 하였을 때 onCancelled 콜백이 호출 될꺼에요.
...