場合によっては、長いポーリングhttpリクエストをクライアント側から切断する必要があります。サーバーに対して作成するHttpUrlConnectionの関連部分は次のとおりです(以下のすべてのコードはスレッドのrun()メソッド内にあります)。
try {
URL url = new URL(requestURL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Accept-Charset", "UTF-8");
connection.setConnectTimeout(5 * 1000);
connection.setReadTimeout(60 * 1000);
connection.setRequestMethod("GET");
// read the output from the server
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line + "\n");
}
Log.d(TAG, stringBuilder);
} catch (IOException ioe) {
Log.e(TAG, ioe);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
これは私が最初に開始する方法であり、次に(2番目の遅延の後)リクエストをキャンセルしようとします:
pollThread = new PollThread();
pollThread.start();
Log.d(TAG, "pollThread started");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
pollThread.cancelRequest();
Log.d(TAG, "pollThread presumably cancelled");
}
}, 1000);
そして、これはcancelRequest()メソッドがどのように見えるかです:
public void cancelRequest() {
if (connection != null) {
connection.disconnect();
}
}
つまり、本質的には
- 読み取りタイムアウトが1分のgetリクエストでHttpUrlConnectionを開始します
- それから1秒後、私は以前のリクエストをキャンセルしようとします
- 期待される結果は、connection.disconnect()を呼び出すときに接続がIOExceptionをスローすることです。
そして、これはまさに、さまざまなエミュレーター(2.2〜4.0.3)、Motorola Atrix(2.3.7)、Samsung Note(4.0.1)で発生することです。ただし、2.2を実行している一部のHTCデバイスでは、接続を明示的に終了したにもかかわらず、リクエストは存続し、レスポンスを受信します。これをHTCDesireとHTCGildfireで確認しました。
何が起きてる?2.2以降を実行しているすべてのデバイスでこのようなリクエストを安全にキャンセルするにはどうすればよいですか?
自分で試乗したい場合は、コード全体をここで入手できます:https ://gist.github.com/3306225