2013-07-01 5 views
0

asynctasks가 있습니다. 대화 조각의 한 OnCreate 관점에서 나는 아래처럼 내 AsyncTask를 의 객체를 생성하고 (샘플 코드)의 onclick에 이제취소시 AsyncTask가 취소되지 않습니다.

 @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 

    cashInValidatorListner = new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this); 
     } 

내가 실행하고있는 비동기 TAKS I가 oncancellistner 추가 한

@Override 
public void onClick(View v) { 
    if(v==ok) 
    { 
     if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){ 
      mHomeActivity.mProgressDialog.show(); 
     } 
     cashInValidatorListner.execute(); 
    } 
    } 

이 진행 막대

 @Override 
public void onCancel(DialogInterface dialog) { 

    if(dialog==mProgressDialog) 
    { 
     mDialogExtraOptions.cashInValidatorListner.cancel(true); 
     Toast.makeText(getBaseContext(), "Task Cancled", Toast.LENGTH_SHORT).show(); 
    } 
} 

는 처음 나는 그것이 다시 그것을 실행에 howerver 취소 얻을 비동기 작업을 취소 이미 실행 된 작업을 실행할 수 없다는 오류를줍니다.

내가 문제가 잘 작동 다음은이

 @Override 
public void onClick(View v) { 
    if(v==ok) 
    { 
     if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){ 
      mHomeActivity.mProgressDialog.show(); 
     } 
      cashInValidatorListner = new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this); 
     cashInValidatorListner.execute(); 
    } 
    } 

처럼 해결 될 때마다 사용자 확인을 클릭 버튼의 onclick에 객체를 생성했는데, 내가 실행되었을 때 비동기 작업이 실행되지 않은 이유를 내 질문 첫 번째 경우에는 두 번째입니까?

답변

2

인스턴스 수명 기간 동안 한 번만 Asynctask를 실행할 수 있습니다. 이것은 단순히 Asynctask 객체의 새 인스턴스를 만들고 수행 한 것처럼 새로 만든 객체를 실행하면 해결됩니다.

(new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this)).execute(); 
+0

새 인스턴스를 만드는 것이 좋지 않은 생각입니까? 한 번만 개체를 ​​만들고 그 작업을 취소하려고 시도해야합니까? – Bora

+0

매번 변수에 할당하는 대신 동일한 줄에서 실행할 수 있습니다. – frogmanx

0

견적서를 작성하십시오.

작업

의 (a 두 번째 실행을 시도하면 예외가 발생합니다.)

당신은 IllegalStateException이 Cannot execute task: the task is already running을 얻을 것이다 번만 실행할 수 있습니다.

AsyncTask 인스턴스는 한 번만 사용할 수 있습니다.

스레딩 규칙 아래의 항목을 확인하십시오.

http://developer.android.com/reference/android/os/AsyncTask.html

은 AsyncTask를 호출 cashInValidatorListner,cancel(true)을 취소합니다.

취소 (true)를 호출하면 인터럽트가 백그라운드 스레드로 보내져 인터럽트 가능한 작업을 도울 수 있습니다. 그렇지 않으면 doInBackground() 메소드에서 isCancelled()를 정기적으로 확인해야합니다.

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()) break; 
    } 
    return null; 
} 

출처 :이 작업의 실행을 취소 할 수 Android - Cancel AsyncTask Forcefully

public final boolean cancel (boolean mayInterruptIfRunning)

시도합니다. 작업이 이미 완료되었거나 이미 취소되었거나 다른 이유로으로 취소 할 수없는 경우이 시도는 실패합니다. 성공한 경우 취소가 호출 될 때이 작업이 시작되지 않았으므로이 작업이 실행되지 않아야합니다. 작업이 이미 시작된 경우 mayInterruptIfRunning 매개 변수는이 작업을 실행하는 스레드가 작업을 중지하기 위해 중단되어야하는지 여부를 결정합니다.이 태스크가 정상적으로 완료하기 전에이 취소 된 경우

public final boolean isCancelled()

true를 반환

사용의 isCancelled(). 태스크에 cancel (boolean)를 호출하고있는 경우는, 가능한 한 빨리 태스크를 종료하기 위해서,이 메소드가 돌려주는 값을 doInBackground (Object [])로부터 정기적으로 체크 할 필요가 있습니다.

관련 문제