2012-09-11 4 views
1

두 번째로 단추를 클릭하면 현재 실행중인 작업을 취소하고 다시 작성하는 검색 작업이 있습니다.'작업이 이미 실행되었습니다'로 다시 인스턴스화 된 비동기 작업 호출이 실패했습니다.

if (_searchAsyncTask != null) { 
    // cancel if already running 
    _searchAsyncTask.cancel(true); 
} 
_searchAsyncTask = new SearchAsyncTask(this); 
_searchAsyncTask.execute(data); 

원래 비동기 작업을 다시 호출 한 것처럼 위 코드의 마지막 줄에 오류가 있습니다.

java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once) 

내가 누락 된 상품이 있습니까? 원래 인스턴스가 취소 될 때까지 기다려야합니까?

+0

표면적으로는 코드를 전혀 손상시킬 수 없습니다. 새 인스턴스를 해고하면 예외가 발생하지 않아야합니다. 당신은 그 사이에 (배경으로부터) 또는 그 효과에 이르기까지 앱을 다시 시작할 기회가 있습니까? – dineth

+0

또한이 버전이 실행되는 Android 버전은 무엇입니까? – dineth

+0

이것은 테스트 사용자의 디버그 정보에서 나왔습니다. 특히 '두 번째 실행'문제를 발견하고이를 대체 했으므로이를보기 매우 놀랍습니다. 4.0.3에서 실행 중입니다. –

답변

2

최근 백그라운드에서 다시 시작했을 때 비슷한 예외로 폭탄을 터뜨린이 이상한 문제가 있었고 백그라운드가 중간에 실행 중이었습니다. 나는 (일부 코드가 중복 될 수 있음)이 문제를 해결하기 위해 AsyncTask.executeOnExecutor를 사용하여 전환 :

if (_searchAsyncTask == null) { 
    _searchAsyncTask = new SearchAsyncTask(); 
} 

if (mThreadExecutor != null && !mThreadExecutor.isShutdown()) { 
    mThreadExecutor.shutdownNow(); 
} 

if (mThreadExecutor == null || mThreadExecutor.isShutdown()) { 
    mThreadExecutor = Executors.newSingleThreadExecutor(); 
} 

if (_searchAsyncTask.getStatus() != Status.RUNNING) { 
    _searchAsyncTask.executeOnExecutor(mThreadExecutor); 
} 

이 내 문제를 해결했다. 너 한테 기회를 줄 수 있니?

+0

환호, 이것을 시험 할 것이다. 아웃! –

+0

아직까지이 문제를 재현하지 못 했으므로 버그보고 또는 문제가있는 빌드로 문제를 해결할 것입니다. 투표하려면 삭제하십시오. 시간 내 주셔서 감사합니다 @dineth –

관련 문제