亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android編程開發實現帶進度條和百分比的多線程下載

2020-04-11 11:07:23
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程開發實現帶進度條和百分比的多線程下載。分享給大家供大家參考,具體如下:

繼上一篇《java多線程下載實例詳解》之后,可以將它移植到我們的安卓中來,下面是具體實現源碼:

DownActivity.java:

package com.example.downloads;import java.io.File;import java.io.IOException;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import com.example.downloads.utils.DownLoadThread;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.annotation.SuppressLint;import android.app.Activity;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;public class DownActivity extends Activity {  // 聲明控件  // 路徑與線程數量  public EditText et_url, et_num;  // 進度條  public static ProgressBar pb_thread;  // 顯示進度的操作  public TextView tv_pb;  // 線程的數量  public static int threadNum = 3;  // 每個線程負責下載的大小  public int blockSize;  public static int threadCount;// 數量  // 訪問的path  public String path;  public static boolean flag = true;  // 記錄進度條的值  public static int pb_count = 0;  public static Handler handler;  public static final int TEXTVALUE = 1;  public static int pb_num = 0;  public static int size = 0;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_down);    et_url = (EditText) findViewById(R.id.et_path);    et_num = (EditText) findViewById(R.id.et_threadNum);    pb_thread = (ProgressBar) findViewById(R.id.pb_down);    tv_pb = (TextView) findViewById(R.id.tv_pb);    handler = new Handler() {      @SuppressLint("HandlerLeak")      @Override      public void handleMessage(Message msg) {        super.handleMessage(msg);        switch (msg.what) {        case TEXTVALUE:          System.out.println("-------" + DownActivity.pb_count              + "http://////" + DownActivity.size);          // 改變TEXTView          pb_num = (DownActivity.pb_count * 100) / DownActivity.size;          tv_pb.setText("當前進度是+" + pb_num + "%");          break;        default:          break;        }      }    };  }  @Override  public boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu; this adds items to the action bar if it is present.    getMenuInflater().inflate(R.menu.main, menu);    return true;  }  public void downLoad(View v) {    DownActivity.flag = true;    DownActivity.pb_count = 0;    path = et_url.getText().toString();    String threadNum_et = et_num.getText().toString();    if (TextUtils.isEmpty(path) || TextUtils.isEmpty(threadNum_et)) {      Toast.makeText(this, "不能為空", Toast.LENGTH_LONG).show();      return;    }    Toast.makeText(this, "url:" + path + "--" + threadNum_et,        Toast.LENGTH_LONG).show();    // 轉換成數字    threadNum = Integer.valueOf(threadNum_et);    new Thread(new Runnable() {      @Override      public void run() {        try {          // 創建出URL對象          URL url = new URL(path);          // 創建出 HttpURLConnection對象          HttpURLConnection httpURLConnection = (HttpURLConnection) url              .openConnection();          // 設置 發請求發送的方式          httpURLConnection.setRequestMethod("GET");          // 設置請求是否超時時間          httpURLConnection.setConnectTimeout(5000);          // 設置          httpURLConnection              .setRequestProperty("User-Agent",                  " Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)");          // 是否響應成功          if (httpURLConnection.getResponseCode() == 200) {            // 獲取文件的大小            size = httpURLConnection.getContentLength();            System.out.println("文件的大小" + size);            // 設置進度條的最大值            pb_thread.setMax(size);            // 創建文件 //保存到SD卡上            // 首先判斷是否擁有sdcard            if (Environment.getExternalStorageState().equals(                Environment.MEDIA_MOUNTED)) {              // 獲取sdCard文件目錄對象              File sdFile = Environment                  .getExternalStorageDirectory();              // 創建文件對象              File file = new File(sdFile, "youdao.exe");              RandomAccessFile accessFile = new RandomAccessFile(                  file, "rwd");              // 設置文件的大小              accessFile.setLength(size);              // 每個線程下載的大小              blockSize = size / threadNum;              // 開三個線程 操作此文件              for (int i = 1; i <= threadNum; i++) {                // 1 2 3                // 計算出每個線程開始的位置                int startSize = (i - 1) * blockSize;                // 結束位置                int endSize = (i) * blockSize;                // 當線程是最后一個線程的時候                if (i == threadNum) {                  // 判斷文件的大小是否大于計算出來的結束位置                  if (size > endSize) {                    // 結束位置 等于 文件的大小                    endSize = size;                  }                }                // 為每個線程創建一個隨機的讀取                RandomAccessFile threadAccessFile = new RandomAccessFile(                    file, "rwd");                new Thread(new DownLoadThread(i,                    threadAccessFile, startSize, endSize,                    path)).start();              }            }          }        } catch (MalformedURLException e) {          e.printStackTrace();        } catch (IOException e) {          e.printStackTrace();        }      }    }).start();  }  /**   * 暫停操作   *   * @param v   */  public void downPause(View v) {    Toast.makeText(this, "暫停", Toast.LENGTH_LONG).show();    this.flag = false;  }}

DownLoadThread.java:

package com.example.downloads.utils;import java.io.File;import java.io.FileInputStream;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.URL;import com.example.downloads.DownActivity;import android.os.Environment;public class DownLoadThread implements Runnable {  public RandomAccessFile accessFile; // 每個線程 都擁有一個accessFile的文件對象 線程1 線程2 線程3  // 線程下載文件的起始位置  public int startSize;  public int endSize;  // 文件下載的path路徑  public String path;  public int threadId; // 線程的標識  public DownLoadThread(int threadId, RandomAccessFile accessFile,      int startSize, int endSize, String path) {    this.threadId = threadId;    this.accessFile = accessFile;    this.startSize = startSize;    this.endSize = endSize;    this.path = path;  }  @Override  public void run() {    // 執行run方法    try {      // 創建文件到SD卡上去      // 首先判斷是否擁有sdcard      if (Environment.getExternalStorageState().equals(          Environment.MEDIA_MOUNTED)) {        // 獲取sdCard文件目錄對象        File sdFile = Environment.getExternalStorageDirectory();        File threadFile = new File(sdFile, threadId + ".txt");        if (threadFile.exists()) {          // 讀取該文件的內容          // 創建文件的輸入流對象          FileInputStream fis = new FileInputStream(threadFile);          // 采用工具類讀取          byte data[] = StreamTools.isToData(fis);          // 轉化成字符串          String threadLen = new String(data);          if ((threadLen != null) && (!"".equals(threadLen))) {            startSize = Integer.valueOf(threadLen);            // 解決 416bug的錯誤            if (startSize > endSize) {              startSize = endSize - 1;            }          }        }        // 創建文件        // 創建URL對象        URL url = new URL(path);        // 創建HttpURLConnection對象        HttpURLConnection httpURLConnection = (HttpURLConnection) url            .openConnection();        // 設置請求的頭        httpURLConnection.setRequestMethod("GET");        // 設置請求是否超時時間        httpURLConnection.setConnectTimeout(5000);        // 設置        httpURLConnection            .setRequestProperty("User-Agent",                " Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)");        // 關鍵的設置        httpURLConnection.setRequestProperty("Range", "bytes="            + startSize + "-" + endSize);        // 輸出當前線程        System.out.println("當前線程" + threadId + " 下載開始位置:" + startSize            + " 下載結束位置:" + endSize);        // 響應成功        // 設置隨機讀取文件的 開始位置        accessFile.seek(startSize);        // 獲取相應流對象        InputStream is = httpURLConnection.getInputStream();        // 創建輸出流對象        byte buffer[] = new byte[1024];        int len = 0;        int threadTotal = 0;// 每個線程下載后保存記錄 /        while ((len = is.read(buffer)) != -1) {          accessFile.write(buffer, 0, len);          threadTotal += len;// 記錄你寫入的長度 //xml文件          //改變進度條:          setProgressBar(len);          // 通過文件記錄文件下載的長度          FileOutputStream fos = new FileOutputStream(threadFile);          fos.write((threadTotal + "").getBytes());          fos.flush();          fos.close();          //發送handler消息          DownActivity.handler.sendEmptyMessage(DownActivity.TEXTVALUE);          if(!DownActivity.flag){            return;          }        }        accessFile.close();        is.close();        System.out.println(threadId + "線程執行完畢");        // 線程操作        synchronized (DownActivity.class) {          DownActivity.threadCount++;          if (DownActivity.threadCount >= DownActivity.threadNum) {            for (int i = 1; i <= DownActivity.threadNum; i++) {              // 獲取sdCard上的文件              File deleteFile = new File(sdFile, i + ".txt");              if (deleteFile.exists()) {                // 文件刪除                deleteFile.delete();              }            }          }        }      }    } catch (MalformedURLException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }  public synchronized void setProgressBar(int len){    DownActivity.pb_count+=len;    DownActivity.pb_thread.setProgress(DownActivity.pb_count);  }}

StreamTools.java:

package com.example.downloads.utils;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;public class StreamTools {  public static byte[] isToData(InputStream is) throws IOException{    // 字節輸出流    ByteArrayOutputStream bops = new ByteArrayOutputStream();    // 讀取數據的緩存區    byte buffer[] = new byte[1024];    // 讀取長度的記錄    int len = 0;    // 循環讀取    while ((len = is.read(buffer)) != -1) {      bops.write(buffer, 0, len);    }    // 把讀取的內容轉換成byte數組    byte data[] = bops.toByteArray();    bops.flush();    bops.close();    is.close();    return data;  }}

strings.xml:

<?xml version="1.0" encoding="utf-8"?><resources>  <string name="app_name">downloads</string>  <string name="action_settings">Settings</string>  <string name="tv_down">文件下載的地址</string>  <string name="tv_threadNum">線程數量</string>  <string name="tv_num">0%</string>  <string name="btn_text">下載</string>  <string name="btn_pause">暫停</string>  <string name="et_path">http://172.22.64.8:8080/doudou/youdao.exe</string>  <string name="et_threadNum">3</string></resources>

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:paddingBottom="@dimen/activity_vertical_margin"  android:paddingLeft="@dimen/activity_horizontal_margin"  android:paddingRight="@dimen/activity_horizontal_margin"  android:paddingTop="@dimen/activity_vertical_margin"  tools:context=".DownActivity" >  <TextView    android:id="@+id/textView1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignParentLeft="true"    android:layout_alignParentTop="true"    android:text="@string/tv_down" />  <EditText    android:id="@+id/et_path"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignParentLeft="true"    android:layout_alignParentRight="true"    android:layout_below="@+id/textView1"    android:ems="10"    android:inputType="none"    android:text="@string/et_path" >    <requestFocus />  </EditText>  <TextView    android:id="@+id/textView2"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignParentLeft="true"    android:layout_below="@+id/et_path"    android:text="@string/tv_threadNum" />  <EditText    android:id="@+id/et_threadNum"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignLeft="@+id/textView2"    android:layout_alignRight="@+id/et_path"    android:layout_below="@+id/textView2"    android:ems="10"    android:inputType="number"    android:text="@string/et_threadNum" />  <ProgressBar    android:id="@+id/pb_down"    style="?android:attr/progressBarStyleHorizontal"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignLeft="@+id/et_threadNum"    android:layout_alignRight="@+id/et_threadNum"    android:layout_below="@+id/et_threadNum"    android:layout_marginTop="14dp" />  <TextView    android:id="@+id/tv_pb"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignRight="@+id/textView1"    android:layout_below="@+id/pb_down"    android:layout_marginTop="24dp"    android:text="@string/tv_num" />  <Button    android:id="@+id/btn_down"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignLeft="@+id/pb_down"    android:layout_below="@+id/tv_pb"    android:layout_marginTop="32dp"    android:onClick="downLoad"    android:text="@string/btn_text" />  <Button    android:id="@+id/button1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignLeft="@+id/btn_down"    android:layout_below="@+id/btn_down"    android:layout_marginTop="16dp"    android:onClick="downPause"    android:text="@string/btn_pause" /></RelativeLayout>

效果如下:

最后要注意的是別忘了在項目清單文件中加入權限:

<!-- SDCard權限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 訪問網絡的權限 --><uses-permission android:name="android.permission.INTERNET" />

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产综合久久久久久蜜臀| 午夜精品福利在线观看| 日日摸夜夜添一区| 欧美大片在线影院| 亚洲第一页在线| 国模精品一区二区三区色天香| 国内揄拍国内精品| 国产精品av免费在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 清纯唯美亚洲综合| 91综合免费在线| 亚洲国产精品99久久| 欧美一区视频在线| 日韩精品小视频| 国产99久久精品一区二区 夜夜躁日日躁| 高跟丝袜一区二区三区| 怡红院精品视频| 欧美精品少妇videofree| 国产精品黄色av| xxxx欧美18另类的高清| 91九色综合久久| 欧美日本国产在线| 97国产精品免费视频| 清纯唯美日韩制服另类| 久久久人成影片一区二区三区| 日韩高清av一区二区三区| 国外成人免费在线播放| 日本精品性网站在线观看| 欧美大秀在线观看| 日韩小视频在线观看| 欧美日韩在线观看视频小说| 久久精品国产99国产精品澳门| 热久久99这里有精品| 亚洲欧美色婷婷| 久久久久久久久国产| 欧美精品videos性欧美| 黄色成人av网| 啪一啪鲁一鲁2019在线视频| 欧美精品在线第一页| 久久91精品国产91久久跳| 久久免费视频在线| 国产乱肥老妇国产一区二| 97精品国产97久久久久久免费| 亚洲最新中文字幕| 国产精品久久一| 亚洲91精品在线| 国产999精品| 成人xxxxx| 日韩精品免费在线视频| 91在线观看欧美日韩| 精品久久久视频| 欧美性xxxxxxxxx| 国产精品一区二区在线| 亚洲最新视频在线| 中文字幕精品av| 国内自拍欧美激情| 亚洲电影免费观看| 成人激情在线播放| 91久久精品一区| 欧美激情一二三| 亚洲精品国产精品国自产在线| 成人动漫网站在线观看| 88国产精品欧美一区二区三区| 97在线观看视频国产| 日韩在线观看网站| 亚洲aa中文字幕| 欧美激情成人在线视频| 欧美电影免费观看高清完整| 久久香蕉国产线看观看网| 欧美性生活大片免费观看网址| 日韩一区二区福利| 第一福利永久视频精品| 日韩av在线影视| 亚洲欧美日韩精品久久奇米色影视| 中文字幕在线看视频国产欧美| 国产精品成人av在线| 国产va免费精品高清在线观看| 久久久av亚洲男天堂| 国产精品欧美一区二区三区奶水| 韩剧1988在线观看免费完整版| 国产一区视频在线| 欧美激情一级精品国产| 国产精品96久久久久久又黄又硬| 久久久精品国产一区二区| 欧美专区福利在线| 隔壁老王国产在线精品| 91av视频在线| 国产精品丝袜久久久久久不卡| 欧美性生交大片免费| 日韩欧美在线国产| 国产xxx69麻豆国语对白| 欧美成人在线影院| 日韩中文字幕av| 日韩有码在线视频| 欧美黑人xxx| 日韩专区在线播放| 日韩小视频在线| 正在播放欧美视频| 国产精品美女主播在线观看纯欲| 国产精品久久一区主播| 欧美亚洲国产精品| 久久久久久91| 日本sm极度另类视频| 亚洲国产成人久久综合一区| 91综合免费在线| 亚洲国产精品久久| 91国产美女在线观看| 亚洲人成网站999久久久综合| 亚洲欧洲一区二区三区久久| 97碰碰碰免费色视频| 欧美午夜丰满在线18影院| 久久久久久亚洲精品| 亚洲一二在线观看| 亚洲最大成人网色| 日韩av电影国产| 日韩中文字幕在线免费观看| 97久久超碰福利国产精品…| 亚洲国产精品推荐| 亚洲аv电影天堂网| 国产欧美日韩视频| 成人a级免费视频| 久久国产精品久久久久久| 青青草成人在线| 一本色道久久88综合日韩精品| 国产精品久久久久久久久免费看| 亚洲日本欧美日韩高观看| 国产香蕉精品视频一区二区三区| 欧美极品欧美精品欧美视频| 91在线网站视频| 国产精品久久久久国产a级| 国产欧美日韩最新| 久久久999精品免费| 91国在线精品国内播放| 亚洲资源在线看| 精品激情国产视频| 欧美日韩裸体免费视频| 亚洲一区二区福利| 91精品国产乱码久久久久久久久| 色偷偷91综合久久噜噜| 日韩一级裸体免费视频| 538国产精品一区二区免费视频| 色青青草原桃花久久综合| 国产精品欧美日韩一区二区| 日韩欧美高清视频| 日韩精品免费综合视频在线播放| 国产精品久久久久高潮| 国产精品视频资源| 亚洲精品国精品久久99热| 亚洲午夜性刺激影院| 国产成人短视频| 中文国产成人精品| 欧美精品一本久久男人的天堂| 国产午夜精品一区二区三区| 在线看欧美日韩| 亚洲精品一区二三区不卡| 日韩精品视频在线免费观看| 国产精品久久久久久五月尺| 国产成人久久久精品一区| 国产日韩在线免费| 欧美午夜片在线免费观看| 日韩激情av在线播放| 午夜精品久久久久久99热软件| 久久露脸国产精品| 日本久久精品视频|