キープアライブなしで、単純な HTTP HEAD リクエストを作成したいと思います。
どうすればAndroidでそれを行うことができますか?
通常の Java と Android の場合
パラメータ if_modified_since がゼロ以外の場合、標準の Java コードを使用してリソースの存在をテストし、同時にリソースが変更されたかどうかを確認しています。
URL url = new URL(adr);
try {
URLConnection con = url.openConnection();
con.setIfModifiedSince(if_modified_since);
if (con instanceof HttpURLConnection) {
/* Workaround for https://code.google.com/p/android/issues/detail?id=61013 */
con.addRequestProperty("Accept-Encoding", "identity");
((HttpURLConnection) con).setRequestMethod("HEAD");
int response = ((HttpURLConnection) con).getResponseCode();
if (response == HttpURLConnection.HTTP_UNAVAILABLE)
return false;
if (response == HttpURLConnection.HTTP_NOT_MODIFIED)
return false;
}
if (if_modified_since != 0) {
long modified = OpenOpts.getLastModified(con);
if (modified != 0 && if_modified_since >= modified)
return false;
}
InputStream in = con.getInputStream();
in.close();
return true;
} catch (FileNotFoundException x) {
return false;
} catch (UnknownHostException x) {
return false;
} catch (SocketException x) {
return false;
}
興味深いことに、コードには con.getInputStream() が必要ですが、ここではエラーは発生しません。しかし、JAR を指す URI にも対応するために、いくつかのヘルパー コードが必要でした。ヘルパー コードは次のとおりです。
private static long getLastModified(URLConnection con)
throws IOException {
if (con instanceof JarURLConnection) {
return ((JarURLConnection) con).getJarEntry().getTime();
} else {
return con.getLastModified();
}
}
URI が schema file: である場合、コードは何らかの特殊化によってさらに最適化できます。その後、直接 File.exists() および File.getLastModified() を実行できます。
ここでは ServiceUnvailable 例外をスローしません。基本的には、外側のコードが IOException をキャッチし、getHead() の結果が false であると想定します。
自明:
HttpResponse response = new AndroidHttpClient().execute(new HttpHead(myUrl));
通常AndroidHttpClient
、複数の接続に同じものを使用してから、それを呼び出しますclose
。