多线程加载
来源:互联网 发布:python 读取文件名 编辑:程序博客网 时间:2024/06/15 05:24
========================导依赖 加权限======================
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
compile 'com.loopj.android:android-async-http:1.4.9'
============================布局=========================
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" ><TextView android:id="@+id/tv_path" android:text="多线程下载地址" android:layout_width="match_parent" android:layout_marginTop="50dp" android:layout_height="wrap_content"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="download" android:text="下载" /></LinearLayout>
==========================逻辑代码========================
public class MainActivity extends AppCompatActivity { protected static final String TAG = "MainActivity"; //下载线程的数量 private final static int threadsize = 3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void download(View v){ new Thread(){ public void run() { try { //创建HttpClient对象 HttpClient client = new DefaultHttpClient(); //http://c.hiphotos.baidu.com/image/pic/item/b90e7bec54e736d1e51217c292504fc2d46269f3.jpg //https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1495040157701&di=e75c9d745a6af178d07e3e3b78e3cb3b&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fwallpaper%2F1502%2F03%2Fc0%2F2703334_1422958313278_800x600.jpg //String uri = "http://c.hiphotos.baidu.com/image/pic/item/b90e7bec54e736d1e51217c292504fc2d46269f3.jpg"; String uri="http://wx1.sinaimg.cn/mw690/005RzqMsly1fia3omupu1j31900y27wh.jpg"; //从头信息里获取文件大小 不获取内容 HttpHead request = new HttpHead(uri); HttpResponse response = client.execute(request); //response 只有响应头 没有响应体 if(response.getStatusLine().getStatusCode() == 200){ //从响应头里获取长度 Header[] headers = response.getHeaders("Content-Length"); String value = headers[0].getValue(); //一 获取服务器上文件的大小 int filelength = Integer.parseInt(value); Log.i(TAG, "filelength:"+filelength); //二 在sdcard创建和服务器大小一样的文件 String name = getFileName(uri); File file = new File(Environment.getExternalStorageDirectory(),name); //随机访问文件 RandomAccessFile raf = new RandomAccessFile(file, "rwd"); //设置文件的大小 raf.setLength(filelength); //关闭 raf.close(); //计算每条线程的下载量 int block = (filelength%threadsize == 0)?(filelength/threadsize):(filelength/threadsize+1); //开启三条线程执行下载 for(int threadid=0;threadid<threadsize;threadid++){ new DownloadThread(threadid, uri, file, block).start(); } } } catch (Exception e) { e.printStackTrace(); } }; }.start(); } //线程下载类 private class DownloadThread extends Thread{ private int threadid;//线程的id private String uri;//下载的地址 private File file;//下载文件 private int block;//下载的块 private int start; private int end; public DownloadThread(int threadid, String uri, File file, int block) { super(); this.threadid = threadid; this.uri = uri; this.file = file; this.block = block; //计算下载的开始位置和结束位置 start = threadid * block; end = (threadid + 1)*block -1; } //下载 状态码:200是普通的下载 206是分段下载 Range:范围 @Override public void run() { super.run(); try { RandomAccessFile raf = new RandomAccessFile(file, "rwd"); //跳转到起始位置 raf.seek(start); //分段下载真实内容 HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(uri); request.addHeader("Range", "bytes:"+start+"-"+end);//添加请求头 HttpResponse response = client.execute(request); if(response.getStatusLine().getStatusCode() == 200){ InputStream inputStream = response.getEntity().getContent(); //把流写入到文件 byte[] buffer = new byte[1024]; int len = 0; while((len = inputStream.read(buffer)) != -1){ //写数据 raf.write(buffer, 0, len); } inputStream.close(); raf.close(); Log.i(TAG, "第"+threadid+"条线程下载完成"); } } catch (Exception e) { e.printStackTrace(); } } } private String getFileName(String uri){ return uri.substring(uri.lastIndexOf("/")+1); }}
阅读全文
0 0
- 多线程加载
- 加载图片以及多线程
- 加载图片以及多线程
- 加载图片以及多线程
- Ogre多线程加载问题
- MBProgressHUD多线程加载图片
- 多线程与异步加载
- Android 多线程数据加载
- 多线程加载图片demo
- ios 多线程加载图片
- android 多线程 图片:加载
- 多线程加载网络图片
- cocos多线程加载资源
- ImageLoader图片多线程加载
- 多线程下载加载视频
- 多线程第一步:资源异步加载
- cococs2d-x 多线程加载plist
- cococs2d-x 多线程加载plist
- arcgis api for javascrpit 基于dojo框架的query查询功能1
- ASP.NET Core集成现有系统认证
- PEP8管理Python代码风格
- 向ASP.NET Core迁移
- PAT 1002 A+B for Polynomials (25)
- 多线程加载
- 我的第二棵平衡树: 普通Treap
- 疯狂工作流讲义(第2版)基于Activiti6.x电子书
- 【面向JS--定时器】
- java-面向对象-类和对象
- * 编写一个内部类,外部类为药品类,内部类为药架类,包括一个放置药品的方法,要求: * 1.外部其他类不能直接访问内部类 * 2.但外部其他类可以访问内部类的放置药品方法
- 指定JSON.toJSONString中实体类属性的输出顺序
- Android开发命名规范和编码规范
- 关于eclipse 中Spket 1.6.23 不提示Jquery的原因