2012-11-11 3 views
4

여기 내 과정과 문제 :이 응용 프로그램에서활동이 손실 된 후 비동기 작업을 종료하는

  1. 당신은 시작이 토글 버튼을 누르면이 메뉴에서 Menu (메뉴) 버튼을

  2. 을 클릭 비동기 작업 (30 초마다 소리를냅니다). 이 작업은 토글이 선택 될 때 지속적으로 실행하고 선택하지 않으면 취소합니다. 이 작업은 메뉴 창에 남아있는 한 프로세스를 시작하고 중지하는 데는 도움이됩니다.

  3. 토글 박스를 확인하십시오!

  4. 창이 다시 벗겨지고 메뉴가 다시 열리면 내 토글 저장 상태가 선택되어 프로세스가 아직 실행 중입니다. 그러나 나는 비동기 작업의 해당 인스턴스에 대한 액세스 권한을 잃어 버렸다고 생각합니다. 그러면 토글을 선택 취소하면 프로그램이 중단됩니다.
    myTask.cancle (true); 잃어버린 참조와 같을 수 있습니다. 이제는 더 이상 전화를 걸거나 제어 할 수없는 곳에서 Asynch-Task가 무효화됩니다!

비동기 작업을 잡고이 상황에서 취소하려면 어떻게해야합니까?

TL, DR; 하나의 활동 (mTask = new ...)에서 비동기 작업을 시작한 다음 해당 활동을 종료하면 어떻게 mTask에 계속 액세스 할 수 있습니까?

답변

0

당신은 즉시 활동이 파괴으로 동기화 작업을 중단해야/그것의 필요가없는 경우 중이 야,

@Override 
public void onStop(){ 
    mTask.cancel(); 
} 

는 동기화 작업 Android - Cancel AsyncTask Forcefully

+0

특정 이유로 인해 무기한 실행됩니다. 비동기 작업이 "의미"가 아니라는 것을 알고 있지만 평가 후에는 최상의 솔루션으로 보입니다. – iForgotMyLogin

+0

당신은 그러한 작업을 위해 서비스를 사용해야합니다. –

0

취소에 대한 자세한 정보를 원하시면,이 참조 백그라운드 스레드에서 시간이 많이 걸리는 작업을 실행하기위한 API 인 AsyncTask을 사용해서는 안되며 UI가 끝나거나 중간 결과를 가져올 때 UI를 업데이트 할 수있는 고리를 제공한다고 생각합니다.

간단하게 Runnable과 싱글 톤 패턴을 사용하여 액티비티 구성 및 삭제 전체에서 인스턴스를 찾을 수 있습니다. 당신이 당신의 위젯을 초기화 (간결함을 위해 생략 싱글 보일러) 다음

public class Player implements Runnable { 

    public static void start() {} 

    @Override 
    public void run() { 
    while (alive) { 
     playSound(); 
     sleep(); 
    } 
    } 

    public static void stop() {} 

    public static boolean isAlive() {} 

} 

같은 뭔가 :

checkbox.setChecked(Player.isAlive()); 
checkbox.setOnCheckedStateChangeListener(new OnCheckedChangeListener(){ 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    if (isChecked) 
     Player.start(); 
    else 
     Player.stop(); 
    } 
}); 

당신의 배경 스레드를 시작 어떤 활동에서 완전히 독립적입니다 이쪽으로.

+0

무엇이 runnable (thread?)가 다음과는 별도로 끝나게 할 수 있습니까? 1. 토글을 선택 취소하여 명시 적으로 종료합니다. 2. 전체 앱을 강제 종료합니다. 3. 전화를 다시 시작합니다. ?? 내가 비동기 작업을 사용하고 있는데, 앱이 화면에 집중되어 있지 않아도 활성화 된 상태에서 계속 실행하려면이 프로세스가 필요했기 때문입니다. 전화가 켜져있을 때 일어날 수있는 일을 모두 실행하려면 – iForgotMyLogin

+0

이 스레드는 플래그가 체크 된 경우에만 종료됩니다.일단 시작되면 라이프 사이클은 활동과 독립적입니다. 분명히 앱을 강제 종료하거나 전화를 다시 시작하면 전체 프로세스가 종료되고 스레드가 종료됩니다. 그러나 AsyncTask와 Services도 마찬가지입니다. 서비스를 사용하면 문제가 발생할 때 자동으로 시작되도록 선언 할 수 있습니다 – Raffaele

관련 문제