2014-02-11 2 views
0

네트워크 검색 프로세스를 구현 중이며 배경 처리 AbstractDiscoveryActivityDiscovery이라는 활동이 있습니다. 검색이 실행되면 백그라운드 처리로 넘어 가서 처리가 완료 될 때까지 작동합니다. 심지어 내가 다시 버튼을 누르면, 그것은 처리를 멈추지 않습니다. 뒤로 버튼을 누르면 즉시 백그라운드 처리를 중지하도록 구현할 수 있습니까? 내 AbstractDiscovery도 아래에 나와 있습니다.백그라운드 실행 프로세스를 즉시 중단하는 방법은 무엇입니까?

일부 요청이되었다하더라도
protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()) break; 
    } 
    return null; 
} 

, 당신의 비동기 작업이 완료 될 때까지 기다렸다가 다시

확인을 할 것입니다 :
final public class ActivityDiscovery extends ActivityNet { 
    private AbstractDiscovery mDiscoveryTask = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    } 

    private void startDiscovering() {    
     mDiscoveryTask.execute(); 
    } 
} 

public abstract class AbstractDiscovery extends AsyncTask<Void, HostBean, Void> { 

    //private final String TAG = "AbstractDiscovery"; 

    protected int hosts_done = 0; 
    final protected WeakReference<ActivityDiscovery> mDiscover; 

    protected long ip; 
    protected long start = 0; 
    protected long end = 0; 
    protected long size = 0; 

    public AbstractDiscovery(ActivityDiscovery discover) { 
     mDiscover = new WeakReference<ActivityDiscovery>(discover); 
    } 

    public void setNetwork(long ip, long start, long end) { 
     this.ip = ip; 
     this.start = start; 
     this.end = end; 
    } 

    abstract protected Void doInBackground(Void... params); 

    @Override 
    protected void onPreExecute() { 
     size = (int) (end - start + 1); 
     if (mDiscover != null) { 
      final ActivityDiscovery discover = mDiscover.get(); 
      if (discover != null) { 
       discover.setProgress(0); 
      } 
     } 
    } 

    @Override 
    protected void onProgressUpdate(HostBean... host) { 
     if (mDiscover != null) { 
      final ActivityDiscovery discover = mDiscover.get(); 
      if (discover != null) { 
       if (!isCancelled()) { 
        if (host[0] != null) { 
         discover.addHost(host[0]); 
        } 
        if (size > 0) { 
         discover.setProgress((int) (hosts_done * 10000/size)); 
        } 
       } 

      } 
     } 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
     if (mDiscover != null) { 
      final ActivityDiscovery discover = mDiscover.get(); 
      if (discover != null) { 
       if (discover.prefs.getBoolean(Prefs.KEY_VIBRATE_FINISH, 
         Prefs.DEFAULT_VIBRATE_FINISH) == true) { 
        Vibrator v = (Vibrator) discover.getSystemService(Context.VIBRATOR_SERVICE); 
        v.vibrate(ActivityDiscovery.VIBRATE); 
       } 
       discover.makeToast(R.string.discover_finished); 
       discover.stopDiscovering(); 
      } 
     } 
    } 

    @Override 
    protected void onCancelled() { 
     if (mDiscover != null) { 
      final ActivityDiscovery discover = mDiscover.get(); 
      if (discover != null) { 
       discover.makeToast(R.string.discover_canceled); 
       discover.stopDiscovering(); 
      } 
     } 
     super.onCancelled(); 
    } 
} 

답변

0

이것은 이벤트가 무엇인지에 따라 달라질 수 있습니다. AsyncTask을 중지해야하지만 일반적으로 AsyncTask 확장자 내에서 Boolean 확장자 (true 또는 false)를 설정하고 doInBackground() 메서드 내에서 해당 변수를 확인하고 해당 메서드에 return을 호출하는 프로세스가 가장 일반적입니다.

그래서,이 같은 일이 :

public abstract class AbstractDiscovery extends AsyncTask<Void, HostBean, Void> { 
    Boolean running = true; 

    protected Void doInBackground(Void... params) { 
    while (running) { 
     // Do your stuff 
     ... 

     if (whatEverYouNeedToHappen() == true) 
     running = false; 
    } 

    return null; 
    } 
} 

모범 사례와 충돌하지 않고 해당 작업을 종료의 "직접적인"방법이 아니다.

+0

저는 귀하의 아이디어를 구현했으며 효과가 있습니다. – batuman

0

은 AsyncTask를 한 번만 한 동안)의 isCancelled를 (확인 취소하려면

취소를 설정하려면 asynctask 인스턴스를 가져 와서 .cancel (boolean) 메서드를 사용해야합니다.

관련 문제