如何实现截击的JSON流概念以避免OutOfMemory错误



我最近在我的截击实现中遇到了一个错误,我没有使用截击的任何图像加载概念,我使用它来调用视图寻呼机FragmentStatePagerAdapter中的10个以上的REST api调用,每次滑动一个http restapi调用,一切都很好,但应用程序崩溃了几次,如果我运行应用程序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流概念,以避免将整个对象模型凌空加载到内存中吗?

谢谢你抽出时间。

我不确定!可以用新的Okttp支持java NIO来解决这些问题!

Okhttp2.0 RC现在依赖Okio来支持java.ioava.nio,从而使用ByteString和Buffer更容易访问、存储和处理数据,从而节省CPU和内存。(仅供参考,这让我想起了Koush在NIO支持下的OIN库!)我希望这能解决我的问题!一旦确认正确,我将更新此答案。

相关内容

最新更新