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