将数据从Internet加载到listview的最合适方式

时间:2014-03-24 17:45:14

标签: java android listview android-listview

我有一个简单的查询,但最近一直没有直接的解决方案。 我有一个列表视图与来自互联网的负载报价数据。列表项有点复杂,但这不是问题。列表视图使用加载器加载,该加载器从Internet获取引用数据,解析json并填充VO。 VOs列表在适配器中设置,并且调用notifyDataSetChanged已更改,通过适配器的getView

重新加载列表

现在我在这里使用的模式是:

  • 用户点击按钮,我们打开片段
  • 片段有LoaderCallbacks,我们在onActivityCreated
  • 中启动加载器
  • 加载器有一个缓存的线程池执行器(我不能使用异步加载器,因为它们实际上使用线性加载而不是Android API版本的并行加载),这为每个库存创建了一个下载工作者。
  • 工作人员点击url并下载数据,使用GSON解析JSON,创建一个对象并将其放入加载器的arraylist中。
  • Loader使用锁存器等待直到下载所有引号。
  • 一旦完成,列表就会被加载。

我的问题是,当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);
        }

2 个答案:

答案 0 :(得分:0)

对于正在阅读此内容并遇到类似问题的人,请使用分页'在滚动端加载更多内容'设计,而不是将列表分成几部分。 我在Wifi或3G / 4G上使用由缓存的线程池执行器支持的完全限制加载,并且回退到2个线程的固定线程池执行器并且在任何其他网络上一次加载6时结束。对我很有用。

答案 1 :(得分:-1)

好的我自己也在回答。

没有合理的方法来实现这一目标。应用程序设计方法需要将列表大小限制在一个舒适的水平。在我的情况下,我将焦点从1个100-150种股票的观察名单转移到每个30种股票的多个观察名单。由于我不能放弃过滤和排序功能,所以这是唯一合理的方式。

此外,还需要跟踪网络状态更改并将执行程序调整为缓存中的单线程。当wi-fi打开时全开,并在移动网开启时显示对话框或Toast消息。