【发布时间】:2015-07-11 20:18:42
【问题描述】:
我正在尝试使用 Volley 从后端获取大型 JSON。我正在使用 JsonObjectRequest 和单例 Volley 请求队列来执行此操作。这是我的来源:
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,
URL, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
apiResponse.response(response, null);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
apiResponse.response(null, error);
}
});
mRequestQueue.add(request);
但我总是得到这个异常:
java.lang.OutOfMemoryError
at java.util.HashMap.makeTable(HashMap.java:569)
at java.util.HashMap.doubleCapacity(HashMap.java:589)
at java.util.HashMap.put(HashMap.java:419)
at org.json.JSONObject.put(JSONObject.java:263)
at org.json.JSONTokener.readObject(JSONTokener.java:385)
at org.json.JSONTokener.nextValue(JSONTokener.java:100)
at org.json.JSONTokener.readArray(JSONTokener.java:430)
at org.json.JSONTokener.nextValue(JSONTokener.java:103)
at org.json.JSONTokener.readObject(JSONTokener.java:385)
at org.json.JSONTokener.nextValue(JSONTokener.java:100)
at org.json.JSONObject.<init>(JSONObject.java:155)
at org.json.JSONObject.<init>(JSONObject.java:172)
at com.android.volley.toolbox.JsonObjectRequest.parseNetworkResponse(JsonObjectRequest.java:103)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:123)
你知道它为什么会崩溃吗?会不会和我的 JSON 响应过大有关?
【问题讨论】:
-
使用Gson库解析海量数据,
-
Volley 分配与响应一样大的字节缓冲区。如果您的响应占用了几兆字节,您可能会因为 Volley 而导致 OOM。对于大响应,您应该避免使用 volley 并改用另一个库,并结合像 Gson 这样的拉解析器。如果您的响应不是那么大,则可能是内存泄漏或缓存过大而占用了您的应用程序中的过多内存。
-
感谢您的回复@BladeCoder。作为 Volley 的替代品,您有什么建议吗?