5

巨大なJSONを受信して​​いて、読み取り中にOutOfMemoryErrorが表示されます。

これが、JSONを解析しようとしている最初のメソッドです。

    InputStream in = response.getEntity().getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8);
    String result = "";

    while (true) {

                String ss = reader.readLine();
                if (ss == null) {
                        break;
                }
                result += ss;
   }

そして、私もこの方法を試しました。

    InputStream in = response.getEntity().getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8);
    StringBuilder sb = new StringBuilder();
    String line = null;

    while ( (line = reader.readLine()) != null)
    {
    sb.append(line);
    }

どちらの場合も、OutOfMemoryErorrが表示されています。

4

4 に答える 4

3

ほとんどの場合、エラーはヒープサイズが原因で発生します。ヒープのサイズを増やす必要があります

ヒープサイズを増やすには

Javaのヒープサイズの詳細については、こちらをご覧ください

于 2013-01-28T14:30:58.363 に答える
3

私が見つけた最善の解決策は、アプリケーションのヒープを上げることでした。

android:largeHeap="true"の下に配置し<application/>ましたAndroidManifest.xml

于 2013-01-29T07:40:11.590 に答える
2

をインスタンス化するときはBufferedReader、のを渡します。これは、バッファが8文字であることint size8意味します(これはあなたが望むものではないと思います)。noを渡すsizeと、デフォルトは8192文字になります。

これを試して:

BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));

またはこれ(同じ効果):

BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8192);

http://developer.android.com/reference/java/io/BufferedReader.html

表示されているエラーが修正されるかどうかは完全にはわかりませんが、機能しない場合は試してみる価値があります。

于 2013-01-28T14:39:48.040 に答える
1

私のJSONコードはステータスを待っていました。ステータスは終わりに近づいています。そこで、以前に戻るようにコードを変更しました。

// try to get formattedAddress without reading the entire JSON
        String formattedAddress;
        while ((read = in.read(buff)) != -1) {
            jsonResults.append(buff, 0, read);
            formattedAddress = ((String) ((JSONObject) new JSONObject(
                    jsonResults.toString()).getJSONArray("results").get(0))
                    .get("formatted_address"));
            if (formattedAddress != null) {
                Log.i("Taxeeta", "Saved memory, returned early from json") ;
                return formattedAddress;
            }               
        }
JSONObject statusObj = new JSONObject(jsonResults.toString());
        String status = (String) (statusObj.optString("status"));
        if (status.toLowerCase().equals("ok")) {
            formattedAddress = ((String) ((JSONObject) new JSONObject(
                    jsonResults.toString()).getJSONArray("results").get(0))
                    .get("formatted_address"));
            if (formattedAddress != null) {
                Log.w("Taxeeta", "Did not saved memory, returned late from json") ;
                return formattedAddress;
            }           
        } 
于 2014-08-06T05:11:24.737 に答える