在执行gson.fromJson()时使用gson + volley的内存不足异常;

时间:2014-10-06 06:19:32

标签: android gson android-volley android-networking

我正在使用volley和gson读取一个非常大的json文件。我看到我需要使用输入流来克服这个问题但是如何从网络响应中创建输入流?

我粘贴了获取get请求响应的gson请求类

public class GsonRequest<T> extends Request<T[]> {

private final Gson gson;
private final Class<T[]> clazz;
private final Map<String, String> headers;
private final Listener<T[]> listener;

public GsonRequest(int method, String url, Class<T[]> clazz,
        Map<String, String> headers, Listener<T[]> listener,
        ErrorListener errorListener) {
    super(method, url, errorListener);

    GsonBuilder gsonBuilder = new GsonBuilder();

    this.gson = gsonBuilder.create();
    this.clazz = clazz;
    this.headers = headers;
    this.listener = listener;
}

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    return headers != null ? headers : super.getHeaders();
}

@Override
protected void deliverResponse(T[] response) {
    listener.onResponse(response);
}

@Override
protected Response<T[]> parseNetworkResponse(NetworkResponse response) {
    try {

        String json = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers));
        // Log.e("Response", json.toString());
        T[] t = gson.fromJson(json, clazz);

        return Response.success(t,
                HttpHeaderParser.parseCacheHeaders(response));

    } catch (UnsupportedEncodingException e) {
        Log.e("Error", "UnsupportedEncodingException");

        return Response.error(new ParseError(e));
    } catch (JsonSyntaxException e) {
        Log.e("Error", "JsonSyntaxException");

        return Response.error(new ParseError(e));
    }

}

}

我的json数据格式

[
   {
        "salary": "Best In Industry",
        "companyProfile": "string",
        "tags": [
            "mtech"
        ],
    }, {
        "salary": "Best In Industry",
        "companyProfile": "string",
        "tags": [     
            "be/btech",
        ],
     }
]

1 个答案:

答案 0 :(得分:1)

阅读示例 此代码读取包含消息数组的JSON文档。它将数组元素作为流逐步执行,以避免将完整文档加载到内存中。它简洁,因为它使用Gson的对象模型来解析单个消息:

public List<Message> readJsonStream(InputStream in) throws IOException {
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
    List<Message> messages = new ArrayList<Message>();
    reader.beginArray();
    while (reader.hasNext()) {
        Message message = gson.fromJson(reader, Message.class);
        messages.add(message);
    }
    reader.endArray();
    reader.close();
    return messages;
}

撰写示例

镜像上面的代码,这会写一个包含消息数组的JSON文档。它受益于流媒体的内存效率和对象模型的简洁性:

public void writeJsonStream(OutputStream out, List<Message> messages) throws IOException {
    JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
    writer.setIndent("  ");
    writer.beginArray();
    for (Message message : messages) {
        gson.toJson(message, Message.class, writer);
    }
    writer.endArray();
    writer.close();
}

参考链接https://sites.google.com/site/gson/streaming