2013-10-10 90 views
1

我正在使用asynctask來執行某個任務。 我也想實現在60秒內完成,否則給出超時異常消息。AsyncTask TimeOut情況解決方案

所以我現在用的是AsyncTask.get(time,timeFormat);

例子:

new Thread(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        try { 
         validateConnection.execute().get(60, TimeUnit.SECONDS); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } catch (ExecutionException e) { 
         e.printStackTrace(); 
        } catch (TimeoutException e) { 
         stopConnTask(); 
         invalidCrediantialsError(Utilities.TIMED_OUT_ERROR); 
         e.printStackTrace(); 
        }catch(CancellationException e){ 
         e.printStackTrace(); 
        }; 
       } 
      }).start(); 

它工作正常,如AsyncTask。在UI線程獲取塊,所以我運行它在單獨的thread。 這種方法是正確的還是我必須考慮別的。

+0

asynctask是asyncrhonous它不會阻塞ui線程,除非您調用'get'而不是'execute' – Raghunandan

+0

但我同時調用validateConnection.execute()。get(60,TimeUnit.SECONDS);它仍然阻止 – Bora

+0

刪除'get'並且它應該運行良好 – Raghunandan

回答

1
public final Result get() 

Added in API level 3 
Waits if necessary for the computation to complete, and then retrieves its result. 

Returns 
The computed result. 
Throws 
CancellationException If the computation was cancelled. 
ExecutionException If the computation threw an exception. 
InterruptedException If the current thread was interrupted while waiting. 

調用get()不會做出的AsyncTask asunchronous。 get()等待阻塞ui線程的結果。刪除get()並使用執行,例如new TheTask().execute()

而且必須的AsyncTask UI線程

+0

它運行良好,我也不想使用get,實際上我希望我的asynctask在60秒之前完成其他給出超時消息。這就是爲什麼我使用得到。 – Bora

+0

其實我是usign asynctask來檢查連接字符串連接數據庫,天氣連接字符串正在返回連接或它是錯的 – Bora

+0

你在做什麼asynctask一個http請求? – Raghunandan

1

的是的AsyncTask primarly旨在將導致在UI線程的ANR,其結果報告給用戶界面長時間運行的任務上調用。

如果您的任務運行時間長達60秒,這意味着您的活動應保持同一時間打開。你真的想要這個嗎?或者您不需要將任何結果應用於UI?

在任何情況下,我都會建議使用內部有線程的服務。您可以從該服務啓動一個意圖,或者發送一個廣播以供用戶界面進一步處理。

p.s.this post給出了一些想法,在這種情況下AsyncTask.get(...)可能是有意義的:基本上說,只有當你的AsyncTask進行一些初始化時,這是UI的一種基礎。

p.p.s:您是否考慮過指定JDBC連接超時?檢查例如this site瞭解更多詳情。

+0

我正在嘗試使用asynctask檢查一個mysql數據庫連接字符串,如果字符串正確,那麼結果可能會出現但是用戶可能會輸入所有不正確的憑據,所以總體而言,我希望檢查應該是60秒,否則會給出超時異常 – Bora

+0

任何時候異步任務完成或超時異常,我需要打開下一步的對話框片段。 – Bora

+0

我希望在60秒內完成任務,因爲通常數據庫連接速度很快,而且如果一項任務的時間超過60秒,那麼連接數據庫的用戶憑證會出現問題。 – Bora