国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲成年人网址 | 久久天堂| 日韩在线一区二区 | 国产精品视频一二三 | 国产精品久久久久久中文字 | 激情综合网激情 | 中文字幕在线观看一区 | 国产不卡一区 | 亚洲网色 | 毛片一区 | 这里只有精品视频 | 国产精品久久久久免费 | 日韩欧美一区二区三区 | 欧美一区二区三区精品 | 天堂一区二区三区在线 | 久久9国产偷伦 | 久综合网 | 一级欧美| 国产精品久久久久久久久久久久久久久久 | 国产精品久久久久久久 | 日韩视频区| 国产精品久久久久久久久久久久 | 91久久在线观看 | 国产精品区二区三区日本 | 91视视频在线观看入口直接观看 | 91久久综合亚洲鲁鲁五月天 | 成人黄色片网站 | 懂色一区二区三区av片 | 成人av一区二区亚洲精 | 91高清在线| 欧美综合一区二区三区 | 国产一区二区视频在线 | 久热精品免费视频 | 在线视频一区二区 | 国产最新视频在线 | 日韩精品三区 | 国产成人精品久久二区二区91 | 亚洲人成网站在e线播放 | 免费又黄又爽又色的视频 | 欧美在线不卡 | 久久99精品久久久久久国产越南 |