Frage

Ich schreibe eine Android-Anwendung, die auf eine Website verbindet und die Suchergebnisse in Form von JSON abruft. Diese Funktion geschieht in einer AsyncTask, die als getrennter Strom von der UI eingerichtet ist. Ich brauche den Fall zu behandeln, in denen die Verbindung unterbrochen / nicht vorhanden / zu latent. Ich brauche diesen Fall, um zu handhaben eine Alertdialog für den Benutzer angezeigt werden läßt sie wissen, die Verbindung schlecht ist. Ich habe Beiträge einen Timeout-Parameter schlagen vor, für URLConnection gesehen, aber ich bin nicht gerade jetzt URLConnection.

Im Moment ist die Funktion funktioniert einwandfrei, wenn ich eine Datenverbindung haben, aber nicht so, wenn keine Verbindung besteht. Wenn ich den Emulator und deaktivieren mein PC die Internetverbindung, bringt die Funktion läuft eine „Force Close“ Nachricht und erzeugt eine Unknown. Ich fange diese Ausnahme, aber meine Anwendung noch abstürzt.

Ich brauche auch einen Fall zu behandeln, in denen kein Thumbnail gefunden werden kann, die eine FileNotFoundException produziert.

Bitte geben Sie mir, was ich tun sollte. Danke.

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

}
War es hilfreich?

Lösung

Ihr Problem ist nicht die UnknownHost sondern in Ihrem schließlich blockieren Schließen Sie nicht offen Ressourcen richtig (nicht, was das Problem verursacht, aber Sie tun es im Wesentlichen falsch) und Sie werden nicht alle möglichen Ausnahmen fangen ( dies ist, warum Sie Code funktioniert nicht wie erwartet). Sie sind viel besser dran du bist Schließung eine try{ __.close(); } catch(__Exception e){...} für jede Ressource hat. Auf diese Weise, wenn einer Ihrer close() Anrufe eine Ausnahme hat, noch die anderen Ressourcen geschlossen lassen, sonst sind Sie nur sie offen und springen direkt in den catch Block in finally zu verlassen.

Der wahre Grund für das Problem ist jedoch, dass die Ressourcen nicht, bevor man eine anfängliche Ausnahme instanziiert zu werden und dann ging in den finally Block. So sind sie immer noch null. Die Ausnahme Sie werden zu kontrollieren sollten, zusammen mit einem IOException ist ein NullPointerException.

Hoffentlich hilft Ihnen aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top