1

앱을 만들면 엄청난 시간이 걸릴 수있는 데이터를 처리해야합니다.IntentService 인터럽트

이제 IntentService에서 많은 내용을 읽었으며 실제로 REST 호출을 처리하기위한 통신 클래스로 구현했지만 실제로는 장기간 실행되는 데이터 처리에 사용하려고합니다.

제목 표시 줄에 진행 표시기를 추가했지만 사용자가 클릭 할 때 작업을 취소 할 수있는 것처럼 표시됩니다.

이 일을 섬세한 방법은? 현재 내가 정적 부울 "실행"을 가지고 있고 나는이 성가신을 찾을

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent.getAction() != null && intent.getAction().equals("stop")) { 
     running = false; 
    } 
    onStart(intent, startId); 
    return START_NOT_STICKY; 
} 

에 onStartCommand를 오버라이드 (override)하고 (Thread.interrupt() 같은 것이) 있는가 우아하지 않고 IntentService를 의도하지 않은 것으로 오용하고 있다고 생각합니다. 이 일을 좀 더 우아한 방법이 있습니까?

stopSelf()가 수행중인 작업을 방해해야하므로 나를 위해 작동하지 않습니다. 나는 그것을 시도하고 코드는 실행에 갔다.

나는 AsyncTask를 생각하지만, 메신저 작업이 늘 생존 걱정. 나는 IntentService 당신의 목적을 위해 정말 적합하지이라고 생각

+0

AsyncTasks를 피하려면 [documentation] (https://developer.android.com/reference/android/)에서 "AsyncTasks를 사용하여 짧은 작업 (이상 최대 몇 초)"에 이상적입니다. os/AsyncTask.html) – Sam

답변

2

(작업이 많은 15분로 걸릴 수 있습니다.) 대신 특정 시작 명령에 대해 Service을 직접 (http://developer.android.com/guide/components/services.html#ExtendingService) 확장하고 메시지 대기열 (Handler)을 지우고 종료 절차를 수행 할 수 있습니다.

+0

내 자신의 서비스를 만드는 것은 다소 과잉스러운 것 같습니다. 필자는 실제로 parralel 실행을 원하지 않습니다 (실제로 문제를 일으킬 것입니다). 그러나 그것은가는 유일한 방법으로 보인다. – Radovan

+1

@Radovan 병렬 실행에 대해 말하는 것이 아닙니다. IntentService와 동일한 태스크 큐를 자유롭게 구현할 수 있습니다. 필요에 맞게 사용자 정의하십시오. –

2

내가이 상황을 생각해내는 간단한 해결책은 배경 스레드 (IntentService가 당신을 위해 회전하는) 코드 검사와 onDestory()에서 설정 한 필드를 추가하는 것입니다.이 필드는 수행 할 때 호출됩니다. IntentService 클래스의 stopService() 호출. 그래서 당신의 IntentService에서

:

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d(LOGTAG, "got on destroy, asking background thread to stop as well"); 
     mPleaseStop = true; 
    } 

다음

@Override 
protected void onHandleIntent(Intent intent) { 
    while(true) { 
     Log.d(LOGTAG, "Doing some long running stuff here"); 
     if (mPleaseStop) { 
      return; 
     } 
    } 
} 

그리고

그냥

stopService(new Intent(this, MyIntentService.class)) 

를 호출하고 올바른로, 당신은 설정을 확인해야합니다 너무 동기화을 선택하십시오.