【问题标题】:Android: Retrieve large Json data from Webservice - get OutOfMemoryErrorAndroid:从 Webservice 检索大型 Json 数据 - 获取 OutOfMemoryError
【发布时间】: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


【解决方案1】:

这是Android平台的限制,所以你必须选择另一种设计,例如分页webservice调用。

【讨论】:

  • 是的,我这样做。我将此答案标记为没有其他更好的答案。
猜你喜欢
  • 1970-01-01
  • 2021-12-28
  • 2017-03-06
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多