Java 将数据从internet加载到listview的最合适方法
我有一个简单的问题,但是最近我一直在思考,没有一个直接的解决方案。 我有一个从互联网加载报价数据的列表视图。列表项有点复杂,但这不是问题。listview是使用从internet获取报价数据、解析json并填充VO的加载程序加载的。VO列表在适配器中设置,并调用Java 将数据从internet加载到listview的最合适方法,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我有一个简单的问题,但是最近我一直在思考,没有一个直接的解决方案。 我有一个从互联网加载报价数据的列表视图。列表项有点复杂,但这不是问题。listview是使用从internet获取报价数据、解析json并填充VO的加载程序加载的。VO列表在适配器中设置,并调用notifyDataSetChangedchanged,它通过适配器的getView 现在我在这里使用的模式是: 用户点击一个按钮,我们打开一个片段 片段有LoaderCallbacks,我们在onActivityCreated 加载器
notifyDataSetChanged
changed,它通过适配器的getView
现在我在这里使用的模式是:
- 用户点击一个按钮,我们打开一个片段
- 片段有
,我们在LoaderCallbacks
onActivityCreated
- 加载器有一个缓存的线程池执行器(我不能使用异步加载器,因为它们基本上使用线性加载,而不是跨Android API版本并行加载),它为每个股票创建一个下载工作器
- 工作者点击url并下载数据,使用GSON解析JSON,创建一个对象并将其放入加载器的arraylist中
- 加载器使用闩锁等待所有报价被下载李>
- 完成所有操作后,将加载列表
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只股票组合在一起,我可以