【发布时间】:2015-10-08 04:16:40
【问题描述】:
我的 Android 应用程序需要通过 web 服务从外部数据库中检索大量数据。数据很大,大约 60000 条记录 (~ 21MB)。我正在使用 AsyncHttpClient,但我从未在 onSuccess 方法中取回结果,这是由 OutOfMemoryError 引起的。
public void getData(final Handler handler) {
if (Log.isLoggable(TAG, Log.INFO)) {
log.info("PreSynch: Start loading " + objectTypeName);
}
(new AsyncHttpClient()).get(presyncUrl, requestParams, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
responseResult(response);
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray result) {
responseResult(result);
}
private void responseResult(Object result) {
// Never reach this code
log.info(objectTypeName + " successfully loaded");
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
// some logs
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
// some logs
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
// some logs
}
});
}
错误是:
E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-209
java.lang.OutOfMemoryError
at java.util.ArrayList.add(ArrayList.java:114)
at org.json.JSONArray.put(JSONArray.java:166)
at org.json.JSONTokener.readArray(JSONTokener.java:430)
at org.json.JSONTokener.nextValue(JSONTokener.java:103)
at com.loopj.android.http.JsonHttpResponseHandler.parseResponse(JsonHttpResponseHandler.java:216)
at com.loopj.android.http.JsonHttpResponseHandler$1.run(JsonHttpResponseHandler.java:120)
at java.lang.Thread.run(Thread.java:856)
【问题讨论】:
-
您正试图将整个文件加载到一个数组中……内存不足……也许不这样做?或者你可以downloadmoreram.com ;)
-
你考虑过批量处理吗?一次说 1000 条记录?有了这么多的数据,我担心它会经常超时。
-
你能告诉我你得到的是哪种类型的数据吗?
-
将分页过程应用于您的 Web 服务。根据您存储数据或显示数据的位置,让我们说 ListView 然后应用分页。例如
http://your_url?page=1假设在第 1 页上您有 500 到 100 条记录,然后使用类似按钮的小部件说Load More然后 page++ 调用相同的服务等等... -
我的数据是 JSON 类型的,我不能在这里公开一个例子,很抱歉。一旦做分页webservice调用,对ws的请求很多,我不知道什么是最好的pageSize。似乎是在框架尝试将 http 响应字符串包装到 JsonArray 时发生错误。
标签: android json web-services