Web サイトに接続し、JSON 形式で検索結果を取得する Android アプリケーションを作成しています。この関数は、UI とは別のストリームとして設定された AsyncTask で発生しています。接続が中断されている/存在しない/潜在的すぎる場合を処理する必要があります。接続が悪いことを知らせる AlertDialog をユーザーに表示するには、このケースを処理する必要があります。URLConnection のタイムアウト パラメータを設定することを提案する投稿を見たことがありますが、現在 URLConnection を使用していません。
現在、データ接続がある場合は機能が問題なく実行されますが、接続がない場合はそうではありません. エミュレーターを実行して PC のインターネット接続を無効にすると、関数を実行すると「強制終了」メッセージが表示され、UnknownHostException が生成されます。この例外をキャッチしていますが、アプリケーションは引き続きクラッシュします。
また、FileNotFoundException を生成するサムネイルが見つからない場合にも対処する必要があります。
私が何をすべきかアドバイスしてください。ありがとう。
@Override
protected HashMap<String, String> doInBackground(Object... params) {
InputStream imageInput = null;
FileOutputStream imageOutput = null;
try {
URL url = new URL("http://www.samplewebsite.com/" + mProductID);
BufferedReader reader =
new BufferedReader(new InputStreamReader(url.openStream()));
String jsonOutput = "";
String temp = "";
while ((temp = reader.readLine()) != null) {
jsonOutput += temp;
}
JSONObject json = new JSONObject(jsonOutput);
// ... Do some JSON parsing and save values to HashMap
String filename = mProductID + "-thumbnail.jpg";
URL thumbnailURL = new URL("http://www.samplewebsite.com/img/" + mProductID + ".jpg");
imageInput = thumbnailURL.openConnection().getInputStream();
imageOutput = mContext.openFileOutput(outputName, Context.MODE_PRIVATE);
int read;
byte[] data = new byte[1024];
while ((read = imageInput.read(data)) != -1) {
imageOutput.write(data, 0, read);
}
reader.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
finally {
try {
imageOutput.close();
imageInput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return mProductInfoHashMap;
}