android下的多线程下载实现方法
16lz
2021-01-25
首先多线程的含义就是不止一个线程,具体线程的数量可以由实际情况决定。
例如这里我使用的是判断网络类型来选择线程数
首先获取当前网络类型
这里可能是wifi也可能是mobile,wifi当然好说,如果是mobile又要涉及到cmwap
如果是cmwap则要设置代理,并且线程数也不用开很多,速度和开销不成正比。
顺带提下设置代理的一些方法,开始我做的时候查资料,好歹了解了cmwap需要通过移动的10.0.0.172:80网关访问外网,于是生搬硬套上了
不过其实java还有更简洁的方法设置代理,例如httpClient.getHostConfiguration().setProxy("10.0.0.172",80);
然后再说下实现多线程下载的原理,首先多线程的数目确定下来以后就可以开线程去下载了。好比你修了几个水管,剩下的任务就是怎么样让这些水管里的水有序的流向水池中。
总文件的长度可以在连接的头文件当中取得
总长度以及分割的数目(水管的数目)都知道了,那么继续埋设管道以及是流水有序就是剩下的两个任务了。
其实管理线程很麻烦,在之前的项目里因为线程管理的失败导致程序经常卡死,后面对多线程并发异步都产生了一些阴影,还好java有很好的多线程管理工具-线程池.
关于线程池的介绍很多,大家可以有兴趣去看看。今天转眼都到10点了,照例我要去睡觉了,大家晚安。
例如这里我使用的是判断网络类型来选择线程数
ConnectivityManager conManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);String networkType = conManager.getActiveNetworkInfo().getTypeName();if (networkType.equals("MOBILE")) {//再次进行区分String netTypeInfo=conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getExtraInfo();if(netTypeInfo.equals("cmwap")){threadNum=3;urlStr="http://10.0.0.172:80"+urlStr.substring(7);isCmwap=true;}if(netTypeInfo.equals("cmnet")){threadNum=3;}threadNum=3;}if (networkType.equals("WIFI")) {threadNum=5;}
首先获取当前网络类型
ConnectivityManager conManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);String networkType = conManager.getActiveNetworkInfo().getTypeName();
这里可能是wifi也可能是mobile,wifi当然好说,如果是mobile又要涉及到cmwap
如果是cmwap则要设置代理,并且线程数也不用开很多,速度和开销不成正比。
顺带提下设置代理的一些方法,开始我做的时候查资料,好歹了解了cmwap需要通过移动的10.0.0.172:80网关访问外网,于是生搬硬套上了
if(netTypeInfo.equals("cmwap")){threadNum=3;urlStr="http://10.0.0.172:80"+urlStr.substring(7);
不过其实java还有更简洁的方法设置代理,例如httpClient.getHostConfiguration().setProxy("10.0.0.172",80);
然后再说下实现多线程下载的原理,首先多线程的数目确定下来以后就可以开线程去下载了。好比你修了几个水管,剩下的任务就是怎么样让这些水管里的水有序的流向水池中。
总文件的长度可以在连接的头文件当中取得
HttpURLConnection con = (HttpURLConnection) url.openConnection();if (con.getHeaderFieldKey(i).equalsIgnoreCase("Content-length")) {//获得head的Content_lengthcontentlength = con.getHeaderField(i);
总长度以及分割的数目(水管的数目)都知道了,那么继续埋设管道以及是流水有序就是剩下的两个任务了。
其实管理线程很麻烦,在之前的项目里因为线程管理的失败导致程序经常卡死,后面对多线程并发异步都产生了一些阴影,还好java有很好的多线程管理工具-线程池.
关于线程池的介绍很多,大家可以有兴趣去看看。今天转眼都到10点了,照例我要去睡觉了,大家晚安。
更多相关文章
- Android(安卓)4.2 JellyBean Graphic Component -- SurfaceFling
- android servicemanager与binder源码分析三------如何进入内核通
- Android开源项目发现--- 工具类依赖注入DI篇(持续更新)
- 疯狂android讲义---Configuration
- android 子线程 UI线程(主线程)通信
- Android必备的Java知识点
- (转帖)Android系列之Message机制的灵活应用
- Android中线程池的分类
- Android: 如何利用Handler处理和发送消息来实现页面刷新的功能