2012-03-23 75 views
5

我想使用AsyncTask來檢查InetAddress,如下面的代碼。變量tempInet是一個全局變量,表示該網站是否可聯繫。我使用代碼開始AsyncTask ... new InetAsyncTask()。execute(「www.facebook.com」);如何在一段時間後取消Android AsyncTask? (例如10秒)

我的問題是,我希望AsyncTask在10秒後(例如)取消自己。

其他一些問題提示使用get(10,TimeUnit.SECONDS)方法。我想這樣做,但不知道在哪裏/如何把get方法。執行?在doInBackground方法中?

另外,get()方法是否會阻塞主線程?如果確實如此,它有什麼意義呢?

任何幫助表示讚賞。

class InetAsyncTask extends AsyncTask<String, String, Boolean> { 



    @Override 
    protected Boolean doInBackground(String... params) { 

     try {     
       InetAddress.getByName("www.facebook.com"); 
       return true;   

       } catch (UnknownHostException e) { 
        return false; 
       } 

    } //end doInBackground function 



    protected void onPostExecute(Boolean... result) { 

      tempInet = result[0]; 

    } 


    } //end class 

相關問題

Android - Setting a Timeout for an AsyncTask?

stop async task after 60 second

Android開發者的AsyncTask文檔

http://developer.android.com/reference/android/os/AsyncTask.html

回答

1

你應該把它取消的AsyncTask處理程序(http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean))

發送延遲的消息,該Handler像:

Handler.sendMessageDelayed(msg, delayMillis) 

private android.os.Handler mHandler = new android.os.Handler() { 

    @Override 
    public void handleMessage(Message msg) { 
     (Your AsyncTask object).cancel(true); 
    } 
} 
0

回答你的問題。與get()一起使用的代碼如下:

Boolean isHost = new AsyncTask<String, Void, Boolean>() { 
      @Override 
      protected Boolean doInBackground(String... params) { 
       try {     
        InetAddress.getByName(params[0]); 
        return true;   
       } catch (UnknownHostException e) { 
        return false; 
       } 
      } 
     }.execute("www.facebook.com").get(PING_TIME, TimeUnit.MILLISECONDS); 

只要需要返回結果,get方法就會阻止調用者線程。因此,您應該只在測試情況下使用它。如果您想獲得異步回答,請按以下方式啓動它(這是我的示例之一,您將不得不爲了您的目的而更改它):

private AsyncTask<Void, Void, Boolean> mAsyncTask; 

private android.os.Handler timeHandler = new android.os.Handler() { 
@Override 
public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     // react here or... 
     mAsyncTask.cancel(true); 
    } 
}; 

public void pingServer() { 

    timeHandler.sendEmptyMessageDelayed(1, PING_TIME);   
    mAsyncTask = new AsyncTask<Void, Void, Boolean>() { 
      @Override 
      protected Boolean doInBackground(Void... params) { 
       // stop the time handler 
       timeHandler.removeMessages(1); 
       return restService.pingServer(); 
      } 

      @Override 
      protected void onPostExecute(Boolean isOnline) { 
       super.onPostExecute(isOnline); 
       // use result after execution (e.g.: send to callback) 
      } 


      @Override 
      protected void onCancelled(Boolean aBoolean) { 
       super.onCancelled(aBoolean); 
       // ...react here 
      } 
     }.execute(); 
} 
相關問題