Listview+Service+download 更新不卡线程方法

方法:

要实现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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值