¿Por qué es la captura de UnknownHostException al usar BufferedReader al flujo abrir URL estrellarse mi aplicación?

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

Pregunta

Estoy escribiendo una aplicación para Android que se conecta a un sitio web y recuperar los resultados de búsqueda en forma de JSON. Esta función está sucediendo en un AsyncTask, que se configura como una corriente separada de la interfaz de usuario. Necesito para manejar el caso en que se interrumpe la conexión / inexistente / demasiado latente. Tengo que manejar este caso con el fin de mostrar una AlertDialog al usuario haciéndoles saber que la conexión es mala. He visto mensajes sugieren establecer un parámetro de tiempo de espera para URLConnection, pero no estoy usando URLConnection en este momento.

En este momento, las lleva a cabo la función sin problemas cuando tengo una conexión de datos, pero no lo es cuando no hay conexión. Cuando ejecuto el emulador y desactivar la conexión a Internet de mi PC, se ejecuta la función aparece un mensaje de "Fuerza de Cierre" y produce una UnknownHostException. Me estoy poniendo esta excepción, pero mi aplicación aún se bloquea.

También necesidad de manejar un caso en el que no se puede encontrar en miniatura, que produce una FileNotFoundException.

Espero su consejo sobre lo que debería hacer. Gracias.

@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;

}
¿Fue útil?

Solución

Su problema no es la UnknownHost sino más bien en el bloque finally no se está cerrando correctamente los recursos abiertos (no lo que está causando el problema, pero básicamente estás haciendo mal) y no está la captura de todas las excepciones posibles ( esto es por qué estás código no está funcionando como se espera). Es mucho mejor tener un try{ __.close(); } catch(__Exception e){...} para CADA recursos que están cerrando. De esta manera si uno de sus llamadas close() tiene una excepción, los otros recursos todavía se cierran, de lo contrario sólo estás dejándolos abiertos y saltar directamente en el bloque de catch en finally.

La verdadera razón de su problema, sin embargo, es que sus recursos no se están ejemplificados antes de conseguir una excepción inicial y después de entrar en el bloque finally. Por lo tanto, siguen siendo null. La excepción que debe ser la captura, junto con un IOException es un NullPointerException.

Esperamos que esto te ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top