Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数据从internet加载到listview的最合适方法_Java_Android_Listview_Android Listview - Fatal编程技术网

Java 将数据从internet加载到listview的最合适方法

Java 将数据从internet加载到listview的最合适方法,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我有一个简单的问题,但是最近我一直在思考,没有一个直接的解决方案。 我有一个从互联网加载报价数据的列表视图。列表项有点复杂,但这不是问题。listview是使用从internet获取报价数据、解析json并填充VO的加载程序加载的。VO列表在适配器中设置,并调用notifyDataSetChangedchanged,它通过适配器的getView 现在我在这里使用的模式是: 用户点击一个按钮,我们打开一个片段 片段有LoaderCallbacks,我们在onActivityCreated 加载器

我有一个简单的问题,但是最近我一直在思考,没有一个直接的解决方案。 我有一个从互联网加载报价数据的列表视图。列表项有点复杂,但这不是问题。listview是使用从internet获取报价数据、解析json并填充VO的加载程序加载的。VO列表在适配器中设置,并调用
notifyDataSetChanged
changed,它通过适配器的
getView

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

  • 用户点击一个按钮,我们打开一个片段
  • 片段有
    LoaderCallbacks
    ,我们在
    onActivityCreated
  • 加载器有一个缓存的线程池执行器(我不能使用异步加载器,因为它们基本上使用线性加载,而不是跨Android API版本并行加载),它为每个股票创建一个下载工作器
  • 工作者点击url并下载数据,使用GSON解析JSON,创建一个对象并将其放入加载器的arraylist中
  • 加载器使用闩锁等待所有报价被下载
  • 完成所有操作后,将加载列表
我的问题是,当listview有很多股票时,比如70到90股,报价下载过程就会变慢。在直接wifi网络上,加载列表大约需要1.5到2秒。在2G、3G等移动数据网络和混合网络上,加载大约需要30-40秒。分析显示了从流中读取数据所花费的大部分时间。每个引用URL命中大约700-800字节,加载大约需要800-900毫秒。我正在使用
HttpURLConnection
加载URL

我不能在列表中使用动态加载模式,因为我有菜单项来过滤和排序listview。如果我们首先没有列表中的所有报价数据,它们就没有任何意义

有没有更好的办法?我已经阅读了周围的内容,并尝试了“当列表中的每一行在屏幕上可见时,为该行创建新的异步任务”,但不能这样使用它,因为这将意味着延迟加载数据

编辑以显示数据的反序列化方式:

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);
        }

好的,我自己回答

没有可行的方法来实现这一点。应用程序设计方法需要将列表大小限制在合适的水平。在我的例子中,我将重点从一个100-150只股票的观察名单转移到多个30只股票的观察名单上。因为我不能放弃过滤和排序功能,所以这是唯一可行的方法


此外,还需要跟踪网络状态的变化,并将执行器从缓存调整为单线程。打开wi-fi时全速前进,打开移动网络时显示对话框或toast消息。

好的,我自己回答

没有可行的方法来实现这一点。应用程序设计方法需要将列表大小限制在合适的水平。在我的例子中,我将重点从一个100-150只股票的观察名单转移到多个30只股票的观察名单上。因为我不能删除过滤和排序功能,所以这是唯一可能的方法


此外,还需要跟踪网络状态的变化,并将执行器从缓存调整为单线程。打开wi-fi时全速前进,打开移动网络时显示对话框或toast消息。

对于阅读此文章并有类似问题的人,请使用分页的“在滚动端加载更多内容”设计,而不是将列表分成几部分。
我在Wifi或3G/4G上使用缓存线程池执行器支持的完全限制负载,在任何其他网络上使用2个线程的固定线程池执行器,每次加载6个线程。对我来说效果很好。

对于那些正在阅读本文并有类似问题的人,请使用分页的“在滚动端加载更多内容”设计,而不是将列表分成几部分。
我在Wifi或3G/4G上使用缓存线程池执行器支持的完全限制负载,在任何其他网络上使用2个线程的固定线程池执行器,每次加载6个线程。对我来说效果很好。

我认为另一件事是将下载的JSON保存在SQLITE DB中,并在片段加载时加载它们。然后,当加载程序再次下载新数据时,将该数据放入数据库并更新listview。但这只是解决问题的一个蹩脚的办法,根本解决不了问题。我读对了吗,你下载的是70-90个报价x 800kbs每个股票报价?对不起,错了。它大约有700-800字节…不是kbs更新了这个问题。是否可以将请求卸载到服务器,然后在完成后下载完整的项目?对于每台设备来说,这可能会有很大的开销。@MichaelTodd:我已经试过了。通过在一次“get quote hit”中将大约2到3个股票组合在一起,我可以减少命中次数(或saw线程),但有效负载大小大致相同,只是头的几个字节不再发送。这种方法实际上有助于改善wifi连接类型,而不是移动网络。在移动网络连接中,从流中读回响应需要更长的时间。我认为另一件事是将下载的JSON保存在SQLITE DB中,并在片段加载时加载它们。然后,当加载程序再次下载新数据时,将该数据放入数据库并更新listview。但这只是解决问题的一个蹩脚的办法,根本解决不了问题。我读对了吗,你下载的是70-90个报价x 800kbs每个股票报价?对不起,错了。它大约有700-800字节…不是kbs更新了这个问题。是否可以将请求卸载到服务器,然后在完成后下载完整的项目?对于每台设备来说,这可能会有很大的开销。@MichaelTodd:我已经试过了。通过在一次“获得报价命中率”中将大约2到3只股票组合在一起,我可以