2012-06-25 2 views
15

나는 게으른 다운로드 및 UI 업데이트를 위해 AsyncTasks을 내 애플리케이션과 함께 사용했습니다. 지금은Android AsyncTasks 활동이 아직 실행 중인지 확인하는 방법

AsyncTasks 실제 단순히 UI를 업데이트합니다

protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     gender.setText(values[0]); 
} 

내 문제는 성별 TextView가에서 렌더링 활동은 계속 사용할 수 있는지 확인하는 방법은?

그렇지 않으면 오류가 발생하고 응용 프로그램이 종료됩니다.

+0

확신으로 시도 할 수없는 여부를 경우 (NULL == 성 && gender.isShown은()) –

답변

25

당신은 활동의들의 OnDestroy

@Override 
protected void onDestroy() { 
    asynctask.cancel(true); 
    super.onDestroy(); 
} 

을에 AsyncTask를 취소 할 수 있습니다 및 변경을 수행 할 때 당신이 당신의 AsyncTask를이 취소되었습니다 (활동이 파괴) 여부를

protected void onProgressUpdate(String... values) { 
    super.onProgressUpdate(values); 
    if(!isCancelled()) { 
     gender.setText(values[0]); 
    } 
} 
+0

니스. 그러나 ondestroy가 매번 부름을받을 보증인이 없습니다. (아래 참조 링크 용). 그걸 어떻게 대처하니? https://stackoverflow.com/a/4449988/3265444 – Ajji

0

하지

if (gender) { 
    gender.setText(values[0]); 
} 

충분할까요?

+0

당신이 (널 (null) == 성)를 위해 복용? 그것만으로도 시간이 충분하지 않습니다. –

+1

아니요, 충분하지 않습니다. 활동이 끝났지 만 성별은 여전히 ​​null이 아니며보기/창이 더 이상 활성화되어 있지 않으므로 참조 시도가 실패합니다. – AgileYogi

1

비록이 시나리오에 직면 한 적이 없습니다. 나는 당신의 질문에 대답하려고 노력할 것입니다.

귀하의 경우 ContextAsyncTask으로 전달했는지 확인해야합니다. 당신은 검증

if(null!=mContext) //Activity still exist!! 
{ 
    gender.setText(values[0]); 
} 
else //Activity is destroyed 
{ 
    //Take appropriate action!! 
} 

활동이이 문에 도달하는 시간에 의해 파괴되는 경우 장점이 될 것입니다, 당신의 Context 자동 null 될 것이다 당신이 시나리오를 처리 할 수있는 수행 할 수 있습니다

.

+2

이것은 작동하지 않습니다. 활동에 대한 하드 참조를 유지하기 때문에 무효화되지 않습니다. 유효하지는 않지만 비동기 작업은 활동을 계속 참조합니다. – uthark

1

내가 주장 여부 확인 Activity가 실행되지 않는 경우 왜 AsyncTask를 취소하지 않습니까? 그것은 더 좋고 실현 가능한 해결책이 될 것입니다. 응용 프로그램이 실행중인 경우 한 활동에서 다른 활동으로 이동한다고하면 AFAIK 오류가 발생하지 않습니다.

if(task != null && task.equals(AsyncTask.Status.RUNNING)) 
task.cancel(true); 
2

내가 비슷한했다

if (!isFinishing()) { 
    gender.setText(values[0]); 
} 
5

시도

, 나는 you'r 활동은 AsyncTask를 실행되지 않았거나 확인하실 수 있습니다, 실행되지 않는 다음 AsyncTask를 취소를 주장하는 것입니다, 문제 - 본질적으로 사용자가 조각을 파괴 한 후 비동기 작업에서 NPE를 얻고있었습니다. 스택 오버플로 문제를 연구 한 후에, 나는 다음과 같은 솔루션을 채택 : 다음

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

를, 내가 확인 주기적으로 내 비동기 코드 "를 실행하면". 스트레스 테스트를 받았으며 지금은 내 활동을 "중단"할 수 없습니다. 이것은 완벽하게 작동하며 내가 보았던 몇 가지 솔루션보다 더 간단하다는 장점이 있습니다.

+0

감사합니다. 나는 마침내 그것이 일하기 위해 도착했다! !! – sshashank124

+1

이것은 간단하고 실제로 의미가 있습니다. 누군가가 '휘발성'키워드에 대해 생각하고 있다면, 이것을 읽어보십시오 : http://stackoverflow.com/a/107040/4331787 –

1

안드로이드 개발자 알 수 에 하나 개의 교육의 this 일환으로, 작업 완료와 기준이 그것을 사용하기 전에 null 인 경우 확인 후 업데이트해야하는 UI 요소에 WeakReference을 유지한다. 이것은 UI가 여전히 주변에 있는지 확인하는 것뿐만 아니라 UI 요소가 가비지 수집되는 것을 방지하지도 않습니다.

1

확인 작업이 실행 중이거나

if (!isFinishing()) { 
    // Do whatever you want to do 
} 
관련 문제