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

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

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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产好深好硬好爽我还要视频 | 亚洲免费视频一区 | 青青青国产在线 | 日本欧美大码a在线视频播放 | 日本人在线看片 | 日韩一区国产二区欧美三 | 羞羞视频免费观 | 国产精品福利短视在线播放频 | 欧美性受xxxx88喷潮 | 人人艹在线视频 | 男女性gif抽搐出入视频 | 九九成人免费视频 | 亚欧美色 | 亚洲福利天堂网福利在线观看 | 亚洲日本免费 | 九哥草逼网 | 国产午夜精品不卡视频 | 亚洲午夜大片 | 女教师系列三上悠亚在线观看 | 日本福利片国产午夜久久 | 99re8在这里只有精品2 | 日韩 国产 欧美 | 日本美女动态图片 | 1986葫芦兄弟全集免费观看第十集 | 大逼美女 | 好猛好紧好硬使劲好大刺激视频 | 日本精品一区二区在线播放 | 污到你怀疑人生 | 国产在线98福利播放视频免费 | 天天快乐高清在线观看 | 福利片成人午夜在线 | 校草让我脱了内裤给全班看 | 天天舔天天干 | 国产高清视频 | 欧洲肥女大肥臀 | 日本黄a三级三级三级 | 久久黄色免费 | 91麻豆精东果冻天美传媒老狼 | 成 人免费va视频 | 成人国产在线播放 | 亚洲国产精品久久久久久 |