Listview+Service+download 更新不卡线程方法
来源:互联网 发布:企业信息化管理 知乎 编辑:程序博客网 时间:2024/06/05 00:12
方法:
要实现listview上进度条动态更新,一般我们可以采用2种方法:
1. 获得itemview对象,再获得其中的进度条等对象对其重新赋值
2. 通过更新数据源,再调用adapter的notifyDataSetChanged 方法
优劣:
第一种:能定位到item来更新。但是Adapter中的itemview是采用重用的方法,假如一个listview中一次能显示5个item,那么第6个item其实在重用第一个item,这样获得获得的itemview对象并不准确。
第二种:更新数据源,通过数据源中position下标与getView中的下标绑定,这样更新数据就能准确到指定的item。但是频繁调用getView方法,容易造成ui阻塞.
结合:
1. 拿到需要更新的数据源下表pos
2. 判断pos是否在listview的显示中
3. 在显示中则获得itemView对象
4. 更新对应的itemview对象数据
代码:
1.获得pos是否在显示的listview中 , 及更新数据
int firstVisibleRow = listview.getFirstVisiblePosition() -1; int lasVisibleRow = listview.getLastVisiblePosition(); if(pos >= firstVisibleRow && pos<= lasVisibleRow){ View view = (View) listview.getChildAt(pos - firstVisibleRow); ViewHolder holder = new ViewHolder(); holder.progressBar = (ProgressBar) view.findViewById(R.id.downloadPro_list_item); holder.percentTv = (TextView)view.findViewById(R.id.percentTv_list_item); holder.downloadImgBn = (ImageButton)view.findViewById(R.id.download_list_item); holder.svvdTv = (TextView)view.findViewById(R.id.cargo_operation_list_svvd); holder.portTv =(TextView)view.findViewById(R.id.cargo_operation_list_port); holder.terminalTv = (TextView)view.findViewById(R.id.cargo_operation_list_terminal); holder.etaTv = (TextView)view.findViewById(R.id.cargo_operation_list_eta); updateUI(downloadInfo , holder ); }
优化:
1.可以通过修改发送handler的频率来进行优化
if(mesenger != null ){ try { if((System.currentTimeMillis() - lastUpdatedTime > SEND_UPDATE_TIME) || per >=100 || error!= NO_ERROR){ downloadInfo.setPer(getPer()); downloadInfo.setError(getError()); Message msg = Message.obtain(); msg.what = CargoOperationDownloadAdapter.UPDATE_UI; Bundle bundle = new Bundle(); bundle.putSerializable("DownloadInfo" , downloadInfo); msg.setData(bundle); mesenger.send(msg); lastUpdatedTime = System.currentTimeMillis(); } } catch (RemoteException e) { e.printStackTrace(); } }
0 0
- Listview+Service+download 更新不卡线程方法
- ListView局部更新Item,不调用notifyDataSetChanged()方法
- ListView的局部更新,不调用notify方法
- ListView的局部更新,不调用notify方法
- 不使用notifyDataSetChanged更新ListView
- notifyDataSetChanged() 动态更新ListView android线程延迟
- 解决listview出现线程更新错误问题
- 控制viewpage的线程和更新listview的线程
- GIS Service Center – Download
- 更新ListView的几种方法
- ListView实现局部更新的方法
- ListView更新的几种方法
- 为什么不应该重写service方法?
- 为什么不应该重写service方法?
- 为什么不应该重写service方法?
- android service不被kill的方法
- 【转】为什么不应该重写service方法?
- 为什么不应该重写service方法?
- Java集合相关操作
- Android View系统解析(上)
- 01背包详解,DP思维的转换
- 机器学习经典书籍
- 每天一个JavaScript实例-确定web页面的区域
- Listview+Service+download 更新不卡线程方法
- 第9周项目5-程序填充题(3)
- 降低iPhone手机的系统版本
- NCFS 网络层 ./network
- 第9周项目1(1)-while语句
- 第九周项目三——输出星号图(b)
- Openssl 编程入门之 ssl编程
- leetcode OJ 判断单链表中是否有环
- R语言学习笔记(一)