我有一个简单的查询,但最近一直没有直接的解决方案。
我有一个列表视图与来自互联网的负载报价数据。列表项有点复杂,但这不是问题。列表视图使用加载器加载,该加载器从Internet获取引用数据,解析json并填充VO。 VOs列表在适配器中设置,并且调用notifyDataSetChanged
已更改,通过适配器的getView
现在我在这里使用的模式是:
LoaderCallbacks
,我们在onActivityCreated
我的问题是,当listview有很多股票,比如70到90时,报价下载过程会变慢。在直接wifi网络上,加载列表大约需要1.5到2秒。在2G和3G以及Hybrids等移动数据网络上,加载大约需要30-40秒。分析显示从流中读取数据的大部分时间。每个引用网址命中大约700-800字节,加载大约需要800-900毫秒。我正在使用HttpURLConnection
加载网址。
我不能在列表中使用动态加载模式,因为我有菜单项来过滤和排序列表视图。如果我们首先没有列表中的所有引用数据,它们就没有任何意义。
有没有更好的方法呢?我已经阅读了周围的内容并尝试了“当该行在屏幕上可见时,列表中每行的新异步任务”,但不能使用它,因为这意味着延迟加载数据。
编辑以显示如何反序列化数据:
InputStream inputstreamObj = (InputStream) conn.getContent();//getInputStream();
if(inputstreamObj != null){
Reader reader = new InputStreamReader(inputstreamObj);
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(List.class, new CompanyCorpAnnouncementsVODeserializer());
Gson gson = gsonBuilder.create();
retVal = gson.fromJson(reader, List.class);
}
答案 0 :(得分:0)
对于正在阅读此内容并遇到类似问题的人,请使用分页'在滚动端加载更多内容'设计,而不是将列表分成几部分。 我在Wifi或3G / 4G上使用由缓存的线程池执行器支持的完全限制加载,并且回退到2个线程的固定线程池执行器并且在任何其他网络上一次加载6时结束。对我很有用。
答案 1 :(得分:-1)
好的我自己也在回答。
没有合理的方法来实现这一目标。应用程序设计方法需要将列表大小限制在一个舒适的水平。在我的情况下,我将焦点从1个100-150种股票的观察名单转移到每个30种股票的多个观察名单。由于我不能放弃过滤和排序功能,所以这是唯一合理的方式。
此外,还需要跟踪网络状态更改并将执行程序调整为缓存中的单线程。当wi-fi打开时全开,并在移动网开启时显示对话框或Toast消息。