非常に奇妙な問題と思われる問題に遭遇しました。Android アプリで HttpsURLConnection クラスを使用し、Authenticator クラスを使用して認証を行っています。
ユーザー名とパスワードを入力して Web サービスに接続し、JSON 応答を取得できます。有効な資格情報を入力すると、これはまったく問題なく機能し、応答が返されます。ただし、無効な資格情報を指定すると、応答が得られず、非同期タスク (コードを実行している) が完了しません。
接続を行っているコードは次のとおりです。
private static String retrieveStream(String url) throws SocketTimeoutException {
String streamContent = "";
HttpsURLConnection urlConnection = null;
try {
Log.d("Connection", "Connecting to: " + url);
Log.d("Connection", "Opening connection");
urlConnection = (HttpsURLConnection) new URL(url).openConnection();
Log.d("Connection", "Setting connect timeout");
urlConnection.setConnectTimeout(5000);
Log.d("Connection", "Setting read timeout");
urlConnection.setReadTimeout(5000);
Log.d("Connection", "Setting Allow All certs (because this is just testing)");
urlConnection.setHostnameVerifier(new AllowAllHostnameVerifier());
Log.d("Connection", "Connection Response: " + urlConnection.getResponseCode() + " " + urlConnection.getResponseMessage());
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
streamContent = readStreamFromConnection(urlConnection);
Log.d("Connection", "Returned content is: " + streamContent);
}
} catch (MalformedURLException e) {
Log.e("Error", "MalformedURLException thrown in retrieveStream: " + e);
} catch (IOException e) {
Log.e("Error", "IOException thrown in retrieveStream for " + url + " : " + e);
} finally {
urlConnection.disconnect();
}
return streamContent;
}
無効な資格情報でこれを実行すると、ログに次のように記録されます。
07-30 15:52:57.040: DEBUG/Connection(16000): Connecting to: https://webservice-that-i-use
07-30 15:52:57.040: DEBUG/Connection(16000): Opening connection
07-30 15:52:57.040: DEBUG/Connection(16000): Setting connect timeout
07-30 15:52:57.040: DEBUG/Connection(16000): Setting read timeout
07-30 15:52:57.040: DEBUG/Connection(16000): Setting Allow All certs (because this is just testing)
その後、アプリを強制停止するか再デプロイするまで、ここでハングします。例外や ANR は発生しません。
ここに投稿されたものとまったく同じ問題があるようですが、回答はありませんでした。なぜこれが起こるのか誰にも考えがありますか? HttpsURLConnection を使用して、無効な資格情報で接続をタイムアウトさせるにはどうすればよいですか?
どんな助けでも大歓迎です。また、私の同僚はこれを iOS で正常に動作させているため、サーバーの問題ではないことにも注意してください。これは、Asus Transformer TF101 の ICS SDK で実行されています。
読んでくれてありがとう!