如何实现排球的JSON流概念以避免OutOfMemory错误?

时间:2014-02-13 05:46:25

标签: android json caching gson android-volley

我最近在我的凌空实现中遇到了一个错误,我没有使用凌空的任何图像加载概念,我正在使用它在view-pager FragmentStatePagerAdapter中调用更多10个REST api调用每次刷卡重新调用,一切正常,但应用程序崩溃了几次,如果我运行应用程序1000次,它只会崩溃5次。

错误日志:

 FATAL EXCEPTION: 
 java.lang.OutOfMemoryError
 E/AndroidRuntime(5798): at com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:316)
 E/AndroidRuntime(5798): at com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:526)
 E/AndroidRuntime(5798): at com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:549)
 E/AndroidRuntime(5798): at com.android.volley.toolbox.DiskBasedCache$CacheHeader.readHeader(DiskBasedCache.java:392)
 E/AndroidRuntime(5798): at com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:155)
 E/AndroidRuntime(5798): at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:85)

通过谷歌搜索我找到了解决方案,我们必须使用 JSON流媒体概念

详细信息:

  

大多数应用程序应仅使用对象模型API。 JSON流媒体   在一些情况下很有用:当它不可能或时   不希望将整个对象模型加载到内存中。这是最多的   在内存有限的移动平台上相关。当它是   必须在文件完整之前阅读或编写文件   可用。

我在寻找什么?:

我正在尝试使用JSON流式搜索我的排球OutOfMemory解决方案,我正在考虑如何将我的Volley Helper类转换为使用JSON流式传输。

这是我的Volley帮手类:

public class GsonRequest<T> extends Request<T> {
private final Gson gson = new Gson();
private final Class<T> clazz;
private final Map<String, String> headers;
private final Listener<T> listener;

/**
* Make a GET request and return a parsed object from JSON.
*
* @param url URL of the request to make
* @param clazz Relevant class object, for Gson's reflection
* @param headers Map of request headers
*/
public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
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));
return Response.success(
gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
}

任何人都可以指导我转换上面的类来使用JSON流概念来避免将整个对象模型加载到内存中吗?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

我不确定!可能会有新的Okttp支持java NIO会解决这些问题!

Okhttp 2.0 RC现在依赖 Okio 来支持 java.io java.nio 使用ByteString和Buffer更容易访问,存储和处理数据,以便做一些聪明的事情来节省CPU和内存。(仅供参考我想起Koush的OIN库支持NIO!)我希望这能解决我的问题问题!一旦我正确确认,我将更新此答案。