Почему ловить UnkomeHostException при использовании буферреджера, чтобы открыть URL-поток, сбой моего приложения?

StackOverflow https://stackoverflow.com/questions/4362561

Вопрос

Я пишу приложение для 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.

Надеюсь, это поможет вам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top