最近的一个项目中需要实现后台服务多任务下载,在前台界面显示进度。这就需要监听每一个下载任务的进度并不断的刷新界面的进度,但是因为我这个进度条界面会有很多的图片,然后每个下载任务都会发消息给界面处理,造成界面刷新非常的频繁,导致图片不能显示,并且会让界面非常卡。针对这种情况,我采用了两个办法有效解决了这个问题。

1、统一刷新界面

         因为多个任务都会不断的像界面发消息要求刷新界面,太过频繁。我的想法是统一处理,在handler处理消息的方法中,我通过时间进行判断,怎么实现呢?就是将上次处理的时间记录下来,然后如果后面接收到的消息与上次的消息时间差小于1000ms,我就直接返回,不对消息进行处理,这样就可以实现1000ms或者500ms统一刷新每个进度,而不是来一个消息就处理。

public void handleMessage(Message msg) {
    
    switch (msg.what) {
    case UPDATA:
     if(System.currentTimeMillis() - lastUpdatedTime > UPDATE_GAP){   //判断时间差
      update(downingList);     //更新数据的逻辑
      lastUpdatedTime = System.currentTimeMillis();    //记录下处理消息的时间
     }
     break;}

 

2、通过集合记录下要刷新的控件

       前台显示进度的界面可能有很多加载比较耗时的图片等元素,但是我们实际需要更新的可能就只是progressbar或者text等控件,这样我们就不必要每次都adapter.notifyDataSetChanged(),这样如果有过多图片加载会比较慢,或者就可能出现图片不能显示的问题,因为所有图片加载可能就需要1000或500ms,还没等图片加载完,又再一次执行刷新操作,这样我们就看不到图片了。要解决这个问题很简单,我们可以将要更新的控件通过map集合保存,然后刷新的时候取出来只刷新需要刷新的控件,这样就能完美解决问题。