国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android多線程斷點下載-帶進度條和百分比進度顯示效果

2019-12-12 02:44:15
字體:
來源:轉載
供稿:網友

android多線程斷點下載,帶進度條和百分比顯示,斷點下載的臨時數據保存到SD卡的文本文檔中,建議可以保存到本地數據庫中,這樣可以提高存取效率,從而提高系統性能。

效果:

打開軟件:

下載中:

下載完畢:

附代碼如下:

package com.yy.multiDownloadOfBreakPoint;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import android.view.View;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;/** * 多線程斷點下載實例 * @author YUANYUAN * */public class MainActivity extends Activity {  //下載所使用的線程數  protected static final int threadCount = 3;  //下載完畢的標記  public static final int downloadOver = 1;  //更新下載進度標記  public static final int UPDATE_PROGRESS = 0;  //下載資源的路徑輸入框  private EditText et_path;  //下載的進度條  private ProgressBar pb;  //進度顯示  private TextView tv_pb;  //當前累計下載的數據  int curDownCount=0;  //當前活動的下載線程數  protected static int activeThread;  //加入消息處理機制  private Handler handler=new Handler(){    @Override    public void handleMessage(Message msg) {      switch (msg.what) {      case downloadOver:        Toast.makeText(MainActivity.this, "文件已下載完畢!", Toast.LENGTH_LONG).show();        tv_pb.setText("下載完成");        break;      case UPDATE_PROGRESS:        //更新進度顯示        tv_pb.setText("當前進度:"+(pb.getProgress()*100/pb.getMax())+"%");        break;      default:        break;      }    }  };  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    et_path=(EditText) findViewById(R.id.et_path);    et_path.setText("http://192.168.2.114:8080/sqlite.exe");    pb=(ProgressBar) findViewById(R.id.pb);    tv_pb=(TextView) findViewById(R.id.tv_pb);  }    /**   * 開始下載   * @param view   */  public void down(View view){    //獲取下載資源的路徑    final String path=et_path.getText().toString().trim();    //判斷資源路徑是否為空    if (TextUtils.isEmpty(path)) {      Toast.makeText(this, "請輸入下載資源的路徑", Toast.LENGTH_LONG).show();      return;    }    //開啟一個線程進行下載    new Thread(){      public void run() {        try {          //構造URL地址          URL url=new URL(path);          //打開連接          HttpURLConnection conn=(HttpURLConnection) url.openConnection();          //設置請求超時的時間          conn.setConnectTimeout(5000);          //設置請求方式          conn.setRequestMethod("GET");          //獲取相應碼          int code=conn.getResponseCode();          if (code==200) {//請求成功            //獲取請求數據的長度            int length=conn.getContentLength();            //設置進度條的最大值            pb.setMax(length);            //在客戶端創建一個跟服務器文件大小相同的臨時文件            RandomAccessFile raf=new RandomAccessFile("sdcard/setup.exe", "rwd");            //指定臨時文件的長度            raf.setLength(length);            raf.close();            //假設3個線程去下載資源            //平均每一個線程要下載的文件的大小            int blockSize=length/threadCount;            for (int threadId = 1; threadId <= threadCount; threadId++) {              //當前線程下載數據的開始位置              int startIndex=blockSize*(threadId-1);              //當前線程下載數據的結束位置              int endIndex=blockSize*threadId-1;              //確定最后一個線程要下載數據的最大位置              if (threadId==threadCount) {                endIndex=length;              }              //顯示下載數據的區間              System.out.println("線程【"+threadId+"】開始下載:"+startIndex+"---->"+endIndex);              //開啟下載的子線程              new DownloadThread(path, threadId, startIndex, endIndex).start();              //當前下載活動的線程數加1              activeThread++;              System.out.println("當前活動的線程數:"+activeThread);            }                      }else{//請求失敗            System.out.println("服務器異常,下載失敗!");          }        } catch (Exception e) {          e.printStackTrace();          System.out.println("服務器異常,下載失敗!");        }      };    }.start();      }  /**   * 下載文件的子線程 每一個文件都下載對應的數據   * @author YUANYUAN   *   */  public class DownloadThread extends Thread{    private String path;    private int threadId;    private int startIndex;    private int endIndex;        /**     * 構造方法     * @param path 下載文件的路徑     * @param threadId 下載文件的線程     * @param startIndex 下載文件開始的位置     * @param endIndex 下載文件結束的位置     */    public DownloadThread(String path, int threadId, int startIndex,        int endIndex) {      this.path = path;      this.threadId = threadId;      this.startIndex = startIndex;      this.endIndex = endIndex;    }    @Override    public void run() {      //構造URL地址      try {                File tempFile=new File("sdcard/"+threadId+".txt");        //檢查記錄是否存在,如果存在讀取數據,設置真實下載開始的位置        if (tempFile.exists()) {          FileInputStream fis=new FileInputStream(tempFile);          byte[] temp=new byte[1024];          int length=fis.read(temp);          //讀取到已經下載的位置          int downloadNewIndex=Integer.parseInt(new String(temp, 0, length));          //計算出已經下載的數據長度          int areadyDown=downloadNewIndex-startIndex;          //累加已經下載的數據量          curDownCount+=areadyDown;          //設置進度條已經下載的數據量          pb.setProgress(curDownCount);          //設置重新開始下載的開始位置          startIndex=downloadNewIndex;          fis.close();          //顯示真實下載數據的區間          System.out.println("線程【"+threadId+"】真實開始下載數據區間:"+startIndex+"---->"+endIndex);        }                URL url = new URL(path);        HttpURLConnection conn=(HttpURLConnection) url.openConnection();        conn.setConnectTimeout(5000);        conn.setRequestMethod("GET");        //設置請求屬性,請求部分資源        conn.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);        int code=conn.getResponseCode();        if (code==206) {//下載部分資源,正常返回的狀態碼為206          InputStream is=conn.getInputStream();//已經設置了請求的位置,所以返回的是對應的部分資源          //構建隨機訪問文件          RandomAccessFile raf=new RandomAccessFile("sdcard/setup.exe", "rwd");          //設置 每一個線程隨機寫文件開始的位置          raf.seek(startIndex);          //開始寫文件          int len=0;          byte[] buffer=new byte[1024];          //該線程已經下載數據的長度          int total=0;                    while((len=is.read(buffer))!=-1){//讀取輸入流            //記錄當前線程已下載數據的長度            RandomAccessFile file=new RandomAccessFile("sdcard/"+threadId+".txt","rwd");            raf.write(buffer,0,len);//寫文件            total+=len;//更新該線程已下載數據的總長度            System.out.println("線程【"+threadId+"】已下載數據:"+(total+startIndex));            //將已下載數據的位置記錄寫入到文件            file.write((startIndex+total+"").getBytes());            //累加已經下載的數據量            curDownCount+=len;            //更新進度條【進度條的更新可以在非UI線程直接更新,具體見底層源代碼】            pb.setProgress(curDownCount);                        //更新下載進度            Message msg=Message.obtain();            msg.what=UPDATE_PROGRESS;            handler.sendMessage(msg);                        file.close();          }          is.close();          raf.close();          //提示下載完畢          System.out.println("線程【"+threadId+"】下載完畢");        }      } catch (Exception e) {        e.printStackTrace();        System.out.println("線程【"+threadId+"】下載出現異常!!");      }finally{        //活動的線程數減少        activeThread--;        if (activeThread==0) {          for (int i = 1; i <= threadCount; i++) {            File tempFile=new File("sdcard/"+i+".txt");            tempFile.delete();          }          System.out.println("下載完畢,已清除全部臨時文件");          //界面消息提示下載完畢          Message msg=new Message();          msg.what=downloadOver;          handler.sendMessage(msg);        }      }          }  }}

以上這篇android多線程斷點下載-帶進度條和百分比進度顯示效果就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庆城县| 噶尔县| 石嘴山市| 岐山县| 漳平市| 万山特区| 南澳县| 大同市| 肃南| 平潭县| 宜春市| 东源县| 安乡县| 都江堰市| 芷江| 清河县| 安阳县| 浮山县| 昌吉市| 太白县| 柳江县| 昌乐县| 沽源县| 台北市| 吉木乃县| 拉孜县| 博客| 洛隆县| 堆龙德庆县| 信宜市| 莱芜市| 蓝山县| 磐石市| 阿坝县| 师宗县| 南开区| 突泉县| 高阳县| 开远市| 嘉峪关市| 蓬莱市|