2014-02-11 70 views
0

我正在實施網絡發現過程,並且我有一個名爲ActivityDiscovery的活動,並帶有後臺處理AbstractDiscovery。一旦發現被執行,它將進入後臺處理並運行直到完成處理。即使我按回來按鈕,它不會停止處理。如果我按下後退按鈕,我該如何實現立即停止後臺處理?我的AbstractDiscovery也顯示在下面。如何立即停止後臺運行進程?

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設置爲值(truefalse),並在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()曾經在一段時間:

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()) break; 
    } 
    return null; 
} 

即使一些請求提出,你的異步任務會等到它完成並再次

的檢查

設置取消你只需要得到你的asynctask實例並使用方法.cancel(布爾值)