【问题标题】:how to implement JSON streaming concept for volley to avoid OutOfMemory error?如何为凌空实现 JSON 流概念以避免 OutOfMemory 错误?
【发布时间】:2014-02-13 05:46:24
【问题描述】:

我最近在我的 volley 实现中遇到了一个错误,我没有使用任何 volley 的图像加载概念,我正在使用它来调用 view-pager FragmentStatePagerAdapter 一个 http restapi 调用中的 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 流为我的 volley 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 流概念以避免将整个对象模型加载到内存中?

感谢您的宝贵时间。

【问题讨论】:

    标签: android json caching gson android-volley


    【解决方案1】:

    我不确定!可能用新的 Okttp Supports java NIO 会解决这些问题!

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

    【讨论】:

    • @maxxxo 尝试使用 Volley Singleton 模式!重用请求 que 对象!!可能是我没有使用那个单例模式!现在可以与最新的 Okhttp 一起正常工作!仅供参考,您是否想使用类似 Retrofit Dot 模式的 volley 使用名为 github.com/orhanobut/wasp 的 Volley 自定义库
    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2020-12-11
    • 2014-07-15
    相关资源
    最近更新 更多