0

Web サイトに接続し、JSON 形式で検索結果を取得する Android アプリケーションを作成しています。この関数は、UI とは別のストリームとして設定された AsyncTask で発生しています。接続が中断されている/存在しない/潜在的すぎる場合を処理する必要があります。接続が悪いことを知らせる AlertDialog をユーザーに表示するには、このケースを処理する必要があります。URLConnection のタイムアウト パラメータを設定することを提案する投稿を見たことがありますが、現在 URLConnection を使用していません。

現在、データ接続がある場合は機能が問題なく実行されますが、接続がない場合はそうではありません. エミュレーターを実行して PC のインターネット接続を無効にすると、関数を実行すると「強制終了」メッセージが表示され、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;

}
4

1 に答える 1

1

あなたの問題は UnknownHost ではなく、最終ブロックで開いているリソースを正しく閉じていません (問題の原因ではありませんが、本質的に間違っています)、考えられるすべての例外をキャッチしていません (これが理由です)コードが期待どおりに機能していません)。try{ __.close(); } catch(__Exception e){...}閉じる for EACH リソースを持つ方がはるかに優れています。このようにして、呼び出しの 1 つに例外があった場合でも、他のリソースは引き続き閉じられます。それ以外の場合は、それらを開いたままにして、 のブロックにclose()直接ジャンプします。catchfinally

ただし、問題の本当の理由は、最初の例外を取得してfinallyブロックに入る前にリソースがインスタンス化されていないことです。だから、彼らはまだnull. an とともにキャッチする必要がある例外IOExceptionは aNullPointerExceptionです。

うまくいけば、これはあなたを助けます。

于 2010-12-10T19:52:16.637 に答える