2014-02-21 2 views
0

AsyncTask에 약간의 문제가 있습니다. 나는이 방법으로 AsyncTask를 실행 : java.lang.IllegalStateException : 나는 점점 계속 두 번째 문자를 입력하면AsyncTask가 취소를 수신하지 않습니다.

myTask = new myTask(); 

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
       @Override 
       public boolean onQueryTextSubmit(String s) { 
        // same as onquerychange 
        return true; 
       } 

       @Override 
       public boolean onQueryTextChange(String s) { 
        if (!s.isEmpty()) { 
         if (myTask.getStatus() == AsyncTask.Status.RUNNING || 
           myTask.getStatus() == AsyncTask.Status.PENDING) { 
          myTask.cancel(true); 
         } 
         myTask.execute(context, s); 
        } else { 
         myTask.execute(context, "emptyquery"); 
        } 
        return true; 
       } 
      }); 

작업을 실행할 수 없습니다 : 작업이 이미 (작업이 한 번만 실행할 수 있습니다) 실행 된

그래서 취소되지 않는다고 가정합니다. 어떤 제안? 감사합니다

+1

asynctask를 여러 번 호출합니다 – Raghunandan

+0

스레드를 취소 할 필요가 없습니다 – QuokMoon

+0

나는 그것을 보았지만 myTask.cancel을 호출합니다! – iGio90

답변

2

두 번 이상 같은 AsyncTask을 실행할 수 없습니다. 매번 실행하기 전에 인스턴스를 만들어야합니다 (예 :

myTask = new myTask(); 
myTask.execute(context, s); 

물론 처음부터 초기화를 제거 할 수 있습니다. 중지 및 다시 시작, 사용을 위해

:

myTaks.cancel(true); 
myTask = new myTask(); 
myTask.execute(context, s); 

당신이 AsyncTask을 취소하더라도, 당신은 다시 사용할 수 없습니다.

+0

그래, 나도 알아,하지만 한 번만 작업을 실행하고 싶습니다 ... 예를 들어, 내 검색 창에 빨리 입력하면 : a - b - c - d 4 개의 실행 작업이 있습니다 ... 나는 하나만 원합니다. 마지막 검색어에! 가능한? – iGio90

+0

내 대답을 수정했습니다. –

+0

하자! 고맙습니다! – iGio90

2

myTask.cancel();을 호출하면 AsyncTask가 스레드를 중지하려고 시도합니다. doInBackground 내부

if(isCancelled()){ 
    return null; 
} 

을하고 스스로를 차단 : 그 강제로, 당신은 작업이로 취소 된 경우 확인할 수 있습니다. 그렇지 않으면 onPostExecute을 호출하기 전에 AsyncTask의 상태가 점검되었습니다. 이런 식으로 cancel()으로 전화하면 값이 반환되지 않을 것입니다. 여기에서 문서를 확인하십시오. AsyncTask

어쨌든 : AsyncTask는 한 번만 실행할 수 있습니다. 다시 실행해야하는 경우 다른 AsyncTask를 인스턴스화해야합니다.

관련 문제