最近、Android アプリのネットワーク コードの一部をリファクタリングして、Google が推奨するHTTPUrlConnectionを使用しました。以前は、Apache の HTTPClient を使用していました。それらのいずれかが関連しているかどうかはわかりません。
最近ネットワーク コードに加えたもう 1 つのことは、呼び出しに AsyncTask を使用することです。以前は、メイン スレッドで作業を行っていたため (明らかに悪いことでした)、データを取得するときにアプリケーションがハングしたように見えました。問題は、AsyncTask に切り替えてから、かなり頻繁にタイムアウト エラーが発生することです。
このタイムアウト エラーが発生するのはなぜですか?
java.net.ConnectException: failed to connect to <url> (port 80): connect failed: ETIMEDOUT (connection timed out)
これがネットワーク呼び出しを行う AsyncTask です。
private class PostToPHP extends AsyncTask<PostToPHP, Void, String>
{
private String functionName;
private ArrayList<NameValuePair> postKeyValuePairs;
public PostToPHP(String function, ArrayList<NameValuePair> keyValuePairs)
{
functionName= function;
postKeyValuePairs = keyValuePairs;
}
@Override
protected void onPreExecute()
{
progressDialog = ProgressDialog.show(BaseActivity.getInstance(), "Loading", "Please wait...", true, false);
}
@Override
protected String doInBackground(PostToPHP... params)
{
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair(FUNCTION_NAME, functionName));
for (int i = 0; i < postKeyValuePairs.size(); i++) {
nameValuePairs.add(postKeyValuePairs.get(i));
}
try {
URL url = new URL("www.myurl");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("Accept-Charset", iso-8859-1);
OutputStream os = urlConnection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, iso-8859-1));
writer.write(getEncodedPostParameters(nameValuePairs, iso-8859-1));
writer.close();
os.close();
InputStream is = urlConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, iso-8859-1));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
urlConnection.disconnect();
return sb.toString();
}
catch (UnknownHostException e) {
// handle it
return null;
}
catch (Exception e) {
// this is where I'm always getting a timeout exception
return null;
}
}
@Override
protected void onPostExecute(String result)
{
progressDialog.dismiss();
}
}
編集:これは特定のネットワーク通話中にのみ発生したと思っていましたが、さまざまな場所で経験しました.
EDIT 2:これをもう一度見てみると、これが見つかりました。それが私の問題だと思います。これは、ネットワーク呼び出し用に Android AsyncTask を実装する前は存在しませんでした。AsyncTask が何らかの形でスレッド化を台無しにして、タイムアウトを引き起こしていると思います。