Почему возникает перехват UnknownHostException при использовании BufferedReader для открытия потока URL, приводящего к сбою моего приложения? - PullRequest
0 голосов
/ 06 декабря 2010

Я пишу приложение для Android, которое подключается к веб-сайту и получает результаты поиска в форме JSON. Эта функция выполняется в AsyncTask, который настроен как отдельный поток от пользовательского интерфейса. Мне нужно разобраться со случаем, когда соединение прервано / отсутствует / слишком скрыто. Мне нужно обработать этот случай, чтобы отобразить AlertDialog для пользователя, давая ему понять, что соединение плохое. Я видел сообщения, предлагающие установить параметр времени ожидания для URLConnection, но я сейчас не использую URLConnection.

Прямо сейчас, функция работает безупречно, когда у меня есть подключение для передачи данных, но не так, когда нет подключения. Когда я запускаю эмулятор и отключаю интернет-соединение моего компьютера, при запуске функции появляется сообщение «Force Close» и выдается исключение 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;

}

1 Ответ

1 голос
/ 10 декабря 2010

Ваша проблема не в UnknownHost, а скорее в вашем блоке finally, вы не закрываете открытые ресурсы правильно (не в том, что вызывает проблему, но вы по сути делаете это неправильно), и вы не перехватываете все возможные исключения (Вот почему ваш код работает не так, как вы ожидаете).Вам гораздо лучше иметь try{ __.close(); } catch(__Exception e){...} для КАЖДОГО ресурса, который вы закрываете.Таким образом, если один из ваших вызовов close() имеет исключение, другие ресурсы по-прежнему закрываются, в противном случае вы просто оставляете их открытыми и прыгаете прямо в блок catch в finally.

.реальная причина вашей проблемы, однако, заключается в том, что ваши ресурсы не обрабатываются до получения первоначального исключения, а затем переходят в блок finally.Итак, они все еще null.Исключением, которое вы должны поймать, наряду с IOException является NullPointerException.

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

...