我正在编写一个连接到网站并以JSON形式检索搜索结果的Android应用程序。此函数发生在AsyncTask中,AsyncTask设置为与UI分开的流。我需要处理连接中断/不存在/太潜伏的情况。我需要处理这种情况,以便向用户显示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;
}
答案 0 :(得分:1)
你的问题不是UnknownHost,而是在你的finally块中你没有正确关闭开放资源(不是导致问题的原因,但你实际上做错了)并且你没有捕获所有可能的异常(这就是为什么你的代码没有按预期工作的原因)。对于你正在关闭的每个资源,你最好有try{ __.close(); } catch(__Exception e){...}
。这样,如果您的close()
个来电之一有异常,其他资源仍会关闭,否则您只是将其打开并直接跳转到catch
中的finally
区块。< / p>
然而,问题的真正原因是您的资源在获得初始异常然后进入finally
块之前未实例化。所以,他们仍然是null
。您应该捕获的例外以及IOException
是NullPointerException
。
希望这可以帮助你。