2014-12-06 82 views
-1

我在android中運行一個異步任務來ping通特定的URL,但問題是當url無效或不可達時發生異常,因爲sockettimeoutexception如此異常我想停止正在運行的任務。 iagve嘗試使用取消()方法,但會導致應用程序崩潰。如何停止正在運行的異步任務?

我正在使用以下代碼。

private class UrlDataProvider3 extends AsyncTask<String, Void, String> 
{ 

    String ret=""; 
    int checkStatus; 
    Boolean exception=false; 
    @Override 
    protected String doInBackground(String... url) 
    { 

     HttpURLConnection con = null; 

     try 
      { 

      Log.i("RAE", "urlData"+url[0]); 
      HttpURLConnection.setFollowRedirects(true); 
      con = (HttpURLConnection) new URL(url[0]).openConnection(); 
       con.setRequestMethod("POST"); 
       con.setConnectTimeout(20000); 




      } 


     catch (IOException e) 
      { 


      if(e.toString().contains("java.net.SocketTimeoutException:")) 
      { 



       return null; 

      } 



      } 



    return ret; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     Log.i("RAE"," Asyc finished"); 



} 

回答

0

你做這樣的事情:

if((this.downloadNetTask != null) 
     && (this.downloadNetTask.getStatus() != AsyncTask.Status.FINISHED)){ 
     this.downloadNetTask.cancel(true); 
} 

downloadNetTask是你實例異步任務。在異步任務中,實現以下方法來完成取消任務時所需的操作。

protected void onCancelled(List<CompanyNseQuoteDataVO> result) 

protected void onCancelled() 
+0

應用程序崩潰並顯示taskCancellation例外 – 2014-12-06 05:12:51

+0

將堆棧跟蹤粘貼到此處。 – Nazgul 2014-12-06 05:17:01

+0

12-06 10:42:06.192:E/AndroidRuntime(31001):致命例外:主 12-06 10:42:06.192:E/AndroidRuntime(31001):java.util.concurrent.CancellationException – 2014-12-06 05:22:20

0

事情是AsyncTask.cancel()調用只調用任務中的onCancel函數。這是您想要處理取消請求的地方。

這裏是一個小任務,我用它來觸發更新方法

private class SomeTask extends AsyncTask<Void, Void, Void> { 

     private boolean running = true; 

     @Override 
     protected void onCancelled() { 
      running = false; 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
      onUpdate(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      while(running) { 
       publishProgress(); 
      } 
      return null; 
     } 
    } 

或者你可以檢查你的任務如下圖所示。

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