a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統 > Android > 正文

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

2020-04-11 11:32:03
字體:
來源:轉載
供稿:網友

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 97国产免费 | 欧美综合激情 | 青青草91视频 | 国产成人精品视频在线观看 | 黄色av网站在线播放 | 精品国产91亚洲一区二区三区www | 羞羞视频网站在线观看 | 亚洲精品一区二区网址 | 成人久久久 | 亚洲欧美中文日韩在线v日本 | 亚洲中字幕女 | 91在线视频免费观看 | 欧美日韩在线一区 | 成人天堂资源www在线 | 男人的午夜影院 | 欧美一区不卡 | 久久合久久| 日韩在线成人 | 中文字幕av一区二区三区免费看 | 亚洲精品久久久久久久久久 | 97成人在线免费视频 | 日本黄色一级片免费看 | 福利在线播放 | 精品久久精品 | 日本免费黄色 | 一本色道久久综合狠狠躁的推荐 | 国产精品久久免费视频 | 成人小视频在线观看 | 午夜视频一区二区 | 日韩免费在线视频 | 97在线视频免费 | 国产看片网站 | 黄色小视频在线观看 | 国产成人精品午夜视频' | 亚洲国产精品成人 | 在线中文视频 | 青青操狠狠干 | 色综合久久久久 | 91久久综合| 不卡的毛片| 精品九九久久 |