首页 > 开发 > JAVA > 正文

多文件同时上传!上传进度条实时更新!多线程安全!

2016-07-12 20:59:59  来源:慕课网
  前几天写了一篇关于asyncTask实现多线程任务的手记,其中涉及到三个泛型和4个步骤,不知道大家还记得不。由于asyncTask 是异步的所以当我们要完成多文件上传时,需要创建多个线程,但是如果线程过多的话我们使用asyncTask会觉得非常的麻烦,相比之下我们如果使用线程池的话就相对简单的多。
线程池实现的方式如下:
输入代码这样我们非常容易实现多个文件同时上传。但是一般我们实现多任务上传的时候由于用户体验的需要,我们一般会通过进度条实现上传进度的实时更新,并且对上传完成的任务从列表中删除。这里我使用的文件上传是电信的一个sdk,调用接口并且会给我们任务开始,完成,以及进度实时更新的回调。 所以我们只要在进度回调方法中做我们额进度更新操作即可。即进度更新通知我们的任务列表对象,对相应的任务进行更新操作;任务完成通知我们的任务列表对象,对相应的任务进行移除操作。所以此时问题来了,既然是多线程那么每一个任务进度更新,或者任务移除时间都是随机的,所以我们不能确定移除的操作是否会在进度准备更新的那一瞬间,此时操控的对象都是任务列表这个对象,但是由于存在对任务列表的移除,所以列表的长度是在变化的,所以很容易出现数组越界,或者更新任务位置错乱的现象。所以我们可以说这个任务列表对象是一个非线程安全的。此时多线程任务的时候我们就需要用到一个关键字(Synchinized)线程同步。对操控对象的方法使用线程锁。这样就能达到安全的目的。看起来是并发,然而并非真的并发。其实有一种更为简单的方法就是所有操作任务列表的操作都放在handler中,因为handler就是一个线程安全的类。即在回调中唯一要做的就是把回调的参数通过handler传递给主线程。这样也可以实现我们的效果。