当我从android应用程序调用rest api时,它将以JSON
数组的形式发送响应,其中包含5000多个对象。在使用for循环读取和解析响应实体时,它花费了太多时间并且变得无响应。
JSONArray list = new JSONArray(EntityUtils.toString(response.getEntity()));
这是JSON的示例:
[["aa@gmail.com",true],["bb@gmail.com",true],["cc@gmail.com",true],["dd@gmail.com",true],["ee@gmail.com",true],["ff@gmail.com",true],["gg@gmail.com",true],["hh@gmail.com",true]]
请帮助我。
答案 0 :(得分:1)
您可以使用后台线程(通过AsynTask可以轻松完成),并在doInBackground中编写昂贵的代码
private static class BackgroundTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
JSONArray list = new JSONArray(EntityUtils.toString(response.getEntity()));
}
@Override
protected void onPostExecute(String html) {
}
}
还尝试使用其他内容解析json,例如,对于某些类型的数据,gson的速度要快得多。
Feed feed = getGson().fromJson(json, Feed.class);
无论如何,一次返回5000个对象不是一个好习惯,应该改进您的API以处理分页并根据您的需求从每个请求返回10至100个项目。
答案 1 :(得分:0)
首先,您应该在后台线程中执行所有这些任务,并且在可能的情况下使用HashMap<Key,Value>
进行解析时,它具有类似hashmap.get("key")
的方法,这些方法无需使用for循环即可获取值,也可以使用arraylist
还可从中获取值而无需使用for循环。
答案 2 :(得分:0)
解决此问题的最简单,最常用的方法是使用pagination。简而言之-您首先请求50或100个对象并显示它们,然后显示下一个,依此类推。概念是最终用户通常不需要一次全部使用5000个对象,因此可以在需要时接收它们。
如果出于某些业务/逻辑原因,您需要一次处理所有5000个对象,则可以考虑使用另一种通信格式,例如protobuf或XML with SAX parser。
在以上两种情况下,您都需要调整用于与客户端一起提供数据的rest api。如果您无法控制后端,则可以尝试使用Android Profiler来准确检查解析的最慢部分,并在客户端(android)上对其进行优化。