zoukankan      html  css  js  c++  java
  • Android 模拟多线程下载

     以下是一个多线程下载的例子,见代码:

    1、首先是布局文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent">
     5 
     6 
     7     <Button
     8         android:layout_width="wrap_content"
     9         android:layout_height="wrap_content"
    10         android:text="下载"
    11         android:id="@+id/btnDownLoad" />
    12 
    13     <TextView
    14         android:layout_width="wrap_content"
    15         android:layout_height="wrap_content"
    16         android:text="New Text"
    17         android:id="@+id/tv"
    18         android:layout_gravity="center_vertical" />
    19 </LinearLayout>

      2、然后是对应的Activity文件

     1 import android.app.Activity;
     2 import android.os.Handler;
     3 import android.os.Message;
     4 import android.os.Bundle;
     5 import android.view.View;
     6 import android.widget.Button;
     7 import android.widget.TextView;
     8 
     9 import com.yt.httpstudy.util.Download;
    10 
    11 
    12 public class DownLoadActivity extends Activity {
    13     private Button btnDown;
    14     private TextView textView;
    15     private int count = 0;
    16     private Handler handler = new Handler(){
    17         //接收信息并且处理
    18         public void handleMessage(Message message){
    19             int result = message.what;
    20             count += result;
    21            if(count ==3){
    22                //下载完成后刷新页面
    23                 textView.setText("下载完成!"+count);
    24             }
    25         }
    26     };
    27     @Override
    28     protected void onCreate(Bundle savedInstanceState) {
    29         super.onCreate(savedInstanceState);
    30         setContentView(R.layout.activity_down_load);
    31         btnDown = (Button) findViewById(R.id.btnDownLoad);
    32         textView = (TextView) findViewById(R.id.tv);
    33 
    34         btnDown.setOnClickListener(new View.OnClickListener() {
    35             @Override
    36             public void onClick(View view) {
    37 
    38                 new Thread(){
    39                     @Override
    40                     public void run() {
    41                         super.run();
    42                         Download download = new Download(handler);
    43                         //下载资源的地址
    44                         download.downLoadFile("http://192.168.1.123:8080/test/asd.jpg");
    45                     }
    46                 }.start();
    47             }
    48         });
    49     }
    50 }

         3、处理多线程下载

      1 import android.os.Environment;
      2 import android.os.Handler;
      3 import android.os.Message;
      4 
      5 import java.io.File;
      6 import java.io.IOException;
      7 import java.io.InputStream;
      8 import java.io.RandomAccessFile;
      9 import java.net.HttpURLConnection;
     10 import java.net.MalformedURLException;
     11 import java.net.URL;
     12 import java.util.concurrent.Executor;
     13 import java.util.concurrent.Executors;
     14 
     15 /**
     16  * Created by
     17  */
     18 public class Download {
     19 
     20 
     21     public   Handler handler;
     22     //创建线程池
     23     private Executor threadPool = Executors.newFixedThreadPool(3);
     24 
     25     //构造器
     26     public Download(Handler handler){
     27         this.handler = handler;
     28     }
     29 
     30     //线程池对象
     31     static class DownLoadRunnable implements  Runnable{
     32         //指定成员变量
     33         private String url;
     34         private String fileName;
     35         private long start,end;
     36         private Handler handler;
     37 
     38         public DownLoadRunnable(String url,String fileName,long start,long end,Handler handler){
     39             this.url = url;
     40             this.fileName = fileName;
     41             this.start =  start;
     42             this.end = end;
     43             this.handler = handler;
     44 
     45         }
     46         @Override
     47         public void run() {
     48 
     49             HttpURLConnection conn = null;
     50             try {
     51                 URL httpUrl = new URL(url);
     52                 conn = (HttpURLConnection) httpUrl.openConnection();
     53                 conn.setRequestProperty("Range", "bytes=" + start + "-" + end);
     54                 conn.setRequestMethod("GET");
     55                 conn.setReadTimeout(5000);
     56 
     57                 //往本地写文件
     58                 RandomAccessFile access = new RandomAccessFile(new File(fileName),"rwd");
     59                 access.seek(start);
     60                 //读取数据流
     61                 InputStream in = conn.getInputStream();
     62 
     63                 //创建缓冲区
     64                 byte[] b = new byte[1024*4];
     65                 int len = 0;
     66                 while ((len = in.read(b)) !=-1){
     67                     access.write(b,0,len);
     68                 }
     69                 if(access !=null){
     70                     access.close();
     71                 }
     72                 if(in !=null){
     73                     in.close();
     74                 }
     75 
     76                 //发送消息
     77                 Message message = new Message();
     78                 message.what =1;
     79                 handler.sendMessage(message);
     80             } catch (IOException e) {
     81                 e.printStackTrace();
     82             }
     83 
     84         }
     85     }
     86 
     87     public void downLoadFile(String url){
     88         try {
     89             URL httpUrl = new URL(url);
     90             HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
     91             conn.setRequestMethod("GET");
     92             conn.setReadTimeout(5000);
     93 
     94             //获取下载内容长度
     95             int count = conn.getContentLength();
     96             int bloack = count/3;
     97 
     98             //获取文件名
     99             String fileName = getFileName(url);
    100 
    101             //获取外部设备名称
    102             File parent  = Environment.getExternalStorageDirectory();
    103             File fileDownLoad = new File(parent,fileName);
    104 
    105             for(int i=0;i<3;i++){
    106                 long start = i*bloack;
    107                 long end = (i+1)*bloack-1;
    108                 //第三个线程需要包括完最后的数据,否则不完整
    109                 if(i==2){
    110                     end = count;
    111                 }
    112 
    113                 DownLoadRunnable runnable =
    114                         new DownLoadRunnable(url,
    115                                 fileDownLoad.getAbsolutePath(),
    116                                 start,end,handler);
    117                 //线程池提交任务
    118                 threadPool.execute(runnable);
    119             }
    120         } catch (MalformedURLException e) {
    121             e.printStackTrace();
    122         } catch (IOException e) {
    123             e.printStackTrace();
    124         }
    125     }
    126 
    127     //根据URL取出文件名
    128     public String getFileName(String url){
    129         return url.substring(url.lastIndexOf("/")+1);
    130     }
    131 }
  • 相关阅读:
    leetcode 576. Out of Boundary Paths 、688. Knight Probability in Chessboard
    leetcode 129. Sum Root to Leaf Numbers
    leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings
    leetcode 402. Remove K Digits 、321. Create Maximum Number
    leetcode 139. Word Break 、140. Word Break II
    leetcode 329. Longest Increasing Path in a Matrix
    leetcode 334. Increasing Triplet Subsequence
    leetcode 403. Frog Jump
    android中webView加载H5,JS不能调用问题的解决
    通过nginx中转获取不到IP的问题解决
  • 原文地址:https://www.cnblogs.com/hais/p/4764580.html
Copyright © 2011-2022 走看看