一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android實現多線程斷點下載的方法

Android實現多線程斷點下載的方法

2021-03-24 15:55dacainiao007 Android

這篇文章主要介紹了Android實現多線程斷點下載的方法,可實現開始、暫停下載及百分比進度條等功能,非常具有實用價值,需要的朋友可以參考下

本文實例講述了Android實現多線程斷點下載的方法。分享給大家供大家參考。具體實現方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
package cn.itcast.download;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import cn.itcast.mutiledownload.StreamTool;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MutiledownloadActivity extends Activity implements OnClickListener {
  private ProgressBar pb;
  private Button bt;
  private TextView tv;
  private EditText et;
  boolean flag = true;
  boolean stopflag = false;
  private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      pb.setProgress(total);
      int max = pb.getMax();
      if (total >= (max - 1)) {
        total = max;
        flag = false;
      }
      int result = total * 100 / max;
      tv.setText("當前進度 :" + result + "%");
      super.handleMessage(msg);
    }
  };
  int total = 0;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    pb = (ProgressBar) this.findViewById(R.id.pb);
    bt = (Button) this.findViewById(R.id.bt);
    tv = (TextView) this.findViewById(R.id.tv_process);
    et = (EditText) this.findViewById(R.id.et);
    bt.setOnClickListener(this);
  }
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case R.id.bt:
      // 創建一個子線程 定期的更新ui
      if("開始下載".equals(bt.getText().toString())){
        bt.setText("暫停");
        stopflag = false; //開始下載 
      }
      else {
        bt.setText("開始下載");
        stopflag = true;
      }
        new Thread() {
          @Override
          public void run() {
            super.run();
            while (flag) {
              try {
                sleep(1000);
                // 如果total > = 文件長度
                Message msg = new Message();
                handler.sendMessage(msg);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
            }
          }
        }.start();
 
        // 開始執行下載的操作
        String path = et.getText().toString().trim();
        if ("".equals(path)) {
          Toast.makeText(this, "路徑不能為空", 1).show();
          return;
        }
        try {
          URL url = new URL(path);
          HttpURLConnection conn = (HttpURLConnection) url
              .openConnection();
          conn.setRequestMethod("GET");
          conn.setConnectTimeout(5000);
          conn.setRequestProperty("User-Agent",
              "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
          int code = conn.getResponseCode();
          if (code == 200) {
            int len = conn.getContentLength();
            RandomAccessFile file = new RandomAccessFile(
                "/mnt/sdcard/" + getFilenName(path), "rwd");
            // 1.設置本地文件大小跟服務器的文件大小一致
            file.setLength(len);
            // 設置進度條的最大值
            pb.setMax(len);
            // 2 .假設開啟3 個線程
            int threadnumber = 3;
            int blocksize = len / threadnumber;
            /**
             * 線程1 0~ blocksize 線程2 1*bolocksize ~ 2*blocksize 線程3
             * 2*blocksize ~ 文件末尾
             */
            for (int i = 0; i < threadnumber; i++) {
              int startposition = i * blocksize;
              int endpositon = (i + 1) * blocksize;
              if (i == (threadnumber - 1)) {
                // 最后一個線程
                endpositon = len;
              }
              DownLoadTask task = new DownLoadTask(i, path,
                  startposition, endpositon);
              task.start();
            }
          }
        } catch (Exception e) {
          Toast.makeText(this, "下載出現異常", 0).show();
          e.printStackTrace();
        }
      break;
    }
  }
  class DownLoadTask extends Thread {
    int threadid;
    String filepath;
    int startposition;
    int endpositon;
    public DownLoadTask(int threadid, String filepath, int startposition,
        int endpositon) {
      this.threadid = threadid;
      this.filepath = filepath;
      this.startposition = startposition;
      this.endpositon = endpositon;
    }
    @Override
    public void run() {
      try {
        File postionfile = new File("/mnt/sdcard/" + threadid + ".txt");
        URL url = new URL(filepath);
        HttpURLConnection conn = (HttpURLConnection) url
            .openConnection();
        System.out.println("線程" + threadid + "正在下載 " + "開始位置 : "
            + startposition + "結束位置 " + endpositon);
        if (postionfile.exists()) {
          FileInputStream fis = new FileInputStream(postionfile);
          byte[] result = StreamTool.getBytes(fis);
          String str = new String(result);
          if (!"".equals(str)) {
            int newstartposition = Integer.parseInt(str);
            if (newstartposition > startposition) {
              startposition = newstartposition;
            }
          }
        }
        // "Range", "bytes=2097152-4194303")
        conn.setRequestProperty("Range", "bytes=" + startposition + "-"
            + endpositon);
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);
        conn.setRequestProperty("User-Agent",
            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
        InputStream is = conn.getInputStream();
        RandomAccessFile file = new RandomAccessFile("/mnt/sdcard/"
            + getFilenName(filepath), "rwd");
        // 設置 數據從文件哪個位置開始寫
        file.seek(startposition);
        byte[] buffer = new byte[1024];
        int len = 0;
        // 代表當前讀到的服務器數據的位置 ,同時這個值已經存儲的文件的位置
        int currentPostion = startposition;
        // 創建一個文件對象 ,記錄當前某個文件的下載位置
        while ((len = is.read(buffer)) != -1) {
          if (stopflag) {
            return;
          }
          file.write(buffer, 0, len);
          synchronized (MutiledownloadActivity.this) {
            total += len;
          }
          currentPostion += len;
          // 需要把currentPostion 信息給持久化到存儲設備
          String position = currentPostion + "";
          FileOutputStream fos = new FileOutputStream(postionfile);
          fos.write(position.getBytes());
          fos.flush();
          fos.close();
        }
        file.close();
        System.out.println("線程" + threadid + "下載完畢");
        // 當線程下載完畢后 把文件刪除掉
        if (postionfile.exists()) {
          postionfile.delete();
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
      super.run();
    }
  }
  public String getFilenName(String path) {
    int start = path.lastIndexOf("/") + 1;
    return path.substring(start, path.length());
  }
}

希望本文所述對大家的Android程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲AVAV天堂AV在线网爱情 | 1024人成网站色 | 风间由美一区二区播放合集 | 厨房高h| 色婷婷激婷婷深爱五月老司机 | 99热在线这里只有精品 | 欧美男男gaysgays | 亚洲+欧美+国产+综合 | 天天草b | 无限时间看片在线观看 | 成人精品一区二区三区 | 美女校花被调教出奶水 | 天天色天天色天天色 | meyd–456佐山爱在线播放 | 三级理论在线观看 | 国产成人免费片在线观看 | 日本欧美大码a在线视频播放 | 青青草伊人久久 | 99精品全国免费7观看视频 | 亚洲丰满模特裸做爰 | 思思玖玖| 91午夜视频 | 男人的天堂在线观看免费 | 男人肌肌捅女人肌肌 | 久久热这里只有 精品 | gay男强壮军人chinese | 欧美日韩久久中文字幕 | 色交视频| kuaibo成人播放器 | 亚州vs欧州vs日 | 精品老司机在线视频香蕉 | 成人一区二区免费中文字幕 | 青草久久影院 | 俄罗斯引擎首页进入 | 亚洲第一区在线观看 | 免费国产一级 | 思思99热久久精品在2019线 | 成人au免费视频影院 | 国产极品麻豆91在线 | 亚洲高清国产拍精品动图 | 久久中文字幕综合不卡一二区 |