2014-02-13 27 views
3

我最近在我的凌空實現中遇到了一個bug,我沒有使用任何圖像加載抽象概念,我使用它來調用更多10 REST API調用view-pager FragmentStatePagerAdapter一個http restapi調用每一個滑動,一切正常,但應用程序崩潰了幾次,如果我運行應用程序1000次,它只會崩潰5次。如何實施JSON流式概念以避免OutOfMemory錯誤?

錯誤日誌:

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流媒體解決方案,我在想怎麼能轉換我的排球Helper類使用JSON流。

這裏是我的排球輔助類:

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流的概念,以避免整個對象模型加載到內存中凌空轉換?

謝謝你的時間。

回答

0

我不確定!可能會與新的Okttp支持Java NIO將解決這些問題!

Okhttp 2.0 RC現在依賴於Okio支持java.io的java.nio,以使其更訪問,存儲更方便,使用的字節字符串和緩衝區做一些處理數據聰明的事情,以節省CPU和內存。(FYI這記得我Koush的OIN庫支持NIO!)我希望這將解決我的問題!一旦我正確確認,我將更新此答案。

+0

你解決了嗎?怎麼樣 ?我也需要使用這種方法。 – maxxxo

+0

@maxxxo嘗試使用Volley Singleton模式!重用請求隊列對象!可能是我沒用過那個Singleton模式!現在適用於最新的Okhttp! FYI是你想使用像Retrofit Dot模式使用Volley自定義庫稱爲https://github.com/orhanobut/wasp –