我想使用AsyncTask来检查InetAddress,例如在下面的代码中。变量tempInet是一个全局变量,用于指示网站是否可以联系。
我用代码开始AsyncTask ... new InetAsyncTask()。execute(“www.facebook.com”);
我的问题是我希望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
答案 0 :(得分:1)
你应该创建一个取消Asynctask的处理程序(http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean))
向此处理程序发送延迟消息,如:
Handler.sendMessageDelayed(msg, delayMillis)
private android.os.Handler mHandler = new android.os.Handler() {
@Override
public void handleMessage(Message msg) {
(Your AsyncTask object).cancel(true);
}
}
答案 1 :(得分: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();
}