Answers:
HttpURLConnection
有一个setConnectTimeout方法。
只需将超时设置为5000毫秒,然后捕获 java.net.SocketTimeoutException
您的代码应如下所示:
try {
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");
con.setConnectTimeout(5000); //set timeout to 5 seconds
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (java.net.SocketTimeoutException e) {
return false;
} catch (java.io.IOException e) {
return false;
}
setConnectTimeout
在任何隐式连接的方法之前调用(基本上,如果已连接,则抛出IllegalStateException的所有方法)。理想情况下,将setConnectTimeout(readTimeout)设为第一个调用的方法。
con.setReadTimeout()
,它按预期工作。
如果HTTP连接没有超时,则可以在后台线程本身(AsyncTask,Service等)中实现超时检查器,以下类是Customize AsyncTask的示例,该示例在特定时间段后超时
public abstract class AsyncTaskWithTimer<Params, Progress, Result> extends
AsyncTask<Params, Progress, Result> {
private static final int HTTP_REQUEST_TIMEOUT = 30000;
@Override
protected Result doInBackground(Params... params) {
createTimeoutListener();
return doInBackgroundImpl(params);
}
private void createTimeoutListener() {
Thread timeout = new Thread() {
public void run() {
Looper.prepare();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (AsyncTaskWithTimer.this != null
&& AsyncTaskWithTimer.this.getStatus() != Status.FINISHED)
AsyncTaskWithTimer.this.cancel(true);
handler.removeCallbacks(this);
Looper.myLooper().quit();
}
}, HTTP_REQUEST_TIMEOUT);
Looper.loop();
}
};
timeout.start();
}
abstract protected Result doInBackgroundImpl(Params... params);
}
一个样品
public class AsyncTaskWithTimerSample extends AsyncTaskWithTimer<Void, Void, Void> {
@Override
protected void onCancelled(Void void) {
Log.d(TAG, "Async Task onCancelled With Result");
super.onCancelled(result);
}
@Override
protected void onCancelled() {
Log.d(TAG, "Async Task onCancelled");
super.onCancelled();
}
@Override
protected Void doInBackgroundImpl(Void... params) {
// Do background work
return null;
};
}
onPreExecute()
。另外,如果您手动取消任务,则还应该取消计划的呼叫以避免泄漏。
我可以通过添加简单的行来获得针对此类类似问题的解决方案
HttpURLConnection hConn = (HttpURLConnection) url.openConnection();
hConn.setRequestMethod("HEAD");
我的要求是知道响应代码,为此,仅获取元信息就足够了,而不是获取完整的响应正文。
默认的请求方法是GET,这要花很多时间才能返回,最终使我抛出SocketTimeoutException。当我将Request Method设置为HEAD时,响应速度非常快。
HEAD
不会产生任何响应主体的请求。
.setRequestMethod("HEAD")
在他们的代码中。奇怪的是,此描述正是我减少“打开的文件过多”问题所需要的。那谢谢啦?
java.net.ConnectException: Connection timed out: connect
即使在2分钟之前,它也给我带来了麻烦。您知道导致问题的原因吗?