URL이 연결하는 데 5 초 이상 걸리면 false를 반환하고 싶습니다. Java를 사용하면 어떻게 가능합니까? URL이 유효한지 확인하는 데 사용하는 코드는 다음과 같습니다.
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
답변
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;
}
답변
이렇게 시간 제한을 설정할 수 있습니다.
con.setConnectTimeout(connectTimeout);
con.setReadTimeout(socketTimeout);
답변
HTTP Connection이 타임 아웃되지 않는 경우 백그라운드 쓰레드 자체 (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;
};
}
답변
간단한 줄을 추가하면 비슷한 문제에 대한 해결책을 얻을 수 있습니다.
HttpURLConnection hConn = (HttpURLConnection) url.openConnection();
hConn.setRequestMethod("HEAD");
내 요구 사항은 응답 코드를 아는 것이었고 완전한 응답 본문을 얻는 대신 메타 정보를 얻는 것으로 충분했습니다.
기본 요청 방법은 GET이며 반환하는 데 많은 시간이 걸리고 마침내 SocketTimeoutException이 발생했습니다. 요청 방법을 HEAD로 설정했을 때 응답이 매우 빠릅니다.