Почему ловить UnkomeHostException при использовании буферреджера, чтобы открыть URL-поток, сбой моего приложения?
-
09-10-2019 - |
Вопрос
Я пишу приложение для Android, которое подключается к веб-сайту и получает результаты поиска в виде JSON. Эта функция происходит в асинктрике, которая устанавливается как отдельный поток из интерфейса UI. Мне нужно обрабатывать случай, когда соединение прерывается / несуществующее / слишком скрыто. Мне нужно справиться с этим случаем, чтобы отобразить AlertDialog для пользователя, позволяя им знать, что соединение плохое. Я видел посты Предложите установку параметра Timeout для URLConnection, но я не использую URLConnection прямо сейчас.
Прямо сейчас функция выполняет безупречно, когда у меня есть подключение к данным, но не так, когда нет подключения. Когда я запускаю эмулятор и отключите подключение к Интернету моего ПК, работает функция, вызывает сообщение «Закрытие силы» и создает неизвестныйHostException. Я ловлю это исключение, но мое приложение все еще вылетает.
Мне также нужно обрабатывать случай, когда никакой эскизы не найден, что производит файл 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;
}
Решение
Ваша проблема не неизвестная, а скорее в вашем заметном блоком, вы неправильно закрываете открытые ресурсы (не то, что вызывает проблему, но вы, по сути, делаете это неправильно), и вы не ловите все возможные исключения (вот почему Вы код не работает, как вы ожидаете). Вам намного лучше иметь try{ __.close(); } catch(__Exception e){...}
Для каждого ресурса вы закрываете. Таким образом, если один из ваших close()
Звонки имеют исключение, другие ресурсы все еще закрываются, в противном случае вы просто оставляете их открытыми и прыгающими прямо в catch
заблокировать finally
.
Однако настоящая причина вашей проблемы состоит в том, что ваши ресурсы не создаются, прежде чем получить первоначальное исключение, а затем вступить в finally
блокировать. Итак, они все еще null
. Отказ Исключение, которое вы должны ловить, наряду с IOException
это NullPointerException
.
Надеюсь, это поможет вам.