为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Java Android

前几天写了一篇关于asyncTask实现多线程任务的手记,其中涉及到三个泛型和4个步骤,不知道大家还记得不。由于asyncTask 是异步的所以当我们要完成多文件上传时,需要创建多个线程,但是如果线程过多的话我们使用asyncTask会觉得非常的麻烦,相比之下我们如果使用线程池的话就相对简单的多。
线程池实现的方式如下:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); //创建线程池对象,需要最大线程数量 fixedThreadPool.execute(new Runnable);//执行的一个Runnable对象。可以实现Runnable 接口,重写Run方法,并做自己想要做的事情,比如文件上传

这样我们非常容易实现多个文件同时上传。但是一般我们实现多任务上传的时候由于用户体验的需要,我们一般会通过进度条实现上传进度的实时更新,并且对上传完成的任务从列表中删除。这里我使用的文件上传是电信的一个sdk,调用接口并且会给我们任务开始,完成,以及进度实时更新的回调。


所以我们只要在进度回调方法中做我们额进度更新操作即可。即进度更新通知我们的任务列表对象,对相应的任务进行更新操作;任务完成通知我们的任务列表对象,对相应的任务进行移除操作。所以此时问题来了,既然是多线程那么每一个任务进度更新,或者任务移除时间都是随机的,所以我们不能确定移除的操作是否会在进度准备更新的那一瞬间,此时操控的对象都是任务列表这个对象,但是由于存在对任务列表的移除,所以列表的长度是在变化的,所以很容易出现数组越界,或者更新任务位置错乱的现象。所以我们可以说这个任务列表对象是一个非线程安全的。此时多线程任务的时候我们就需要用到一个关键字(Synchinized)线程同步。对操控对象的方法使用线程锁。这样就能达到安全的目的。看起来是并发,然而并非真的并发。


其实有一种更为简单的方法就是所有操作任务列表的操作都放在handler中,因为handler就是一个线程安全的类。即在回调中唯一要做的就是把回调的参数通过handler传递给主线程。这样也可以实现我们的效果。

点击查看更多内容
6人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消