2012-03-23 81 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(); 
} 
相关问题