Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android菜鳥之路-多線程下載

Android菜鳥之路-多線程下載

編輯:關於Android編程

Android客戶端下載步驟

在Android客戶端首先創建一個空文件(空白文件),大小跟服務器的一模一樣。開啟若干線程,分別去下載服務器上對應的資源。如果所有的線程都下載完畢,服務器的資源就下載完畢。

Android客戶端下載邏輯

獲取到服務器端資源文件的大小(connection.getContentLength())

String path = "http://localhost:8080/ff.exe";

URL url = new URL(path);

// 獲取鏈接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

// 參數
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);

// 響應碼
int responseCode = connection.getResponseCode();

if (responseCode == 200) {

    // 得到服務端返回的文件大小
    long contentLength = connection.getContentLength();
    System.out.println("服務器文件大小:"+contentLength);
}

// 斷開連接
connection.disconnect();

在本地創建一個大小和服務器一樣的的空白文件

File file = new File("temp.ext");
RandomAccessFile raf= new RandomAccessFile(file, "rw");
raf.setLength(contentLength);

根據開啟線程的數量,把服務器資源給等分成若干份(threadCount:線程數量)

假設文件大小是10個byte。(長度:length)
假設3個線程(線程數量:threadCount)。
 int blockSize = length / threadCount;
線程1 下載3個byte    1-3     0 * blockSize + 1 ~ 1 * blockSize
線程2 下載3個byte    4-6     1 * blockSize + 1 ~ 2 * blockSize 
線程3 下載4個byte    7-10    2 * blockSize + 1 ~ 3 * blockSize(length)

// 開啟若干個子線程,分別去下載對應的資源
long threadCount = 3;
long blockSize = contentLength / threadCount;

for (int i = 1; i <= threadCount; i++) {
    // 計算下載起始、結束位置
    long startIndex = (i - 1) * blockSize + 0;// 服務器也是從0開始
    long endIndex = i * blockSize - 1; //
    // 最後一個線程
    if (i == threadCount) {
        endIndex = contentLength - 1;
    }
    System.out.println("開啟線程:" + i + ",下載的位置:(" + startIndex + "~"
            + endIndex + ")");
    new DownloadThread(i, startIndex, endIndex, path).start();
}

創建線程類

static class DownloadThread extends Thread {
    private int threadId;
    private long startIndex;
    private long endIndex;
    private String path;

    public DownloadThread(int threadId, long startIndex, long endIndex,
            String path) {
        super();
        this.threadId = threadId;
        this.startIndex = startIndex;
        this.endIndex = endIndex;
        this.path = path;
    }

    public void run() {
        URL url;
        try {
            url = new URL(path);

            // 獲取鏈接
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();

            // 參數
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5000);
            // 告訴服務器下載的參數
            connection.setRequestProperty("Range", "bytes=" + startIndex
                    + "-" + endIndex);

            // 響應碼
            int responseCode = connection.getResponseCode();

            System.out.println("服務器狀態碼:" + responseCode);
            // 下載服務器文件,返回的是206
            if (responseCode == 206) {
                InputStream inputStream = connection.getInputStream();

                File file = new File("temp.exe");
                RandomAccessFile raf = new RandomAccessFile(file, "rw");
                // 指定文件開始寫的位置
                raf.seek(startIndex);
                System.out.println("第" + threadId + "個線程,寫文件的開始、結束位置("
                        + (startIndex) + "," + (endIndex) + ")");

                int len = 0; 
                byte[] buf = new byte[1024];
                while ((len = inputStream.read(buf)) != -1) {
                    raf.write(buf, 0, len);
                }

                inputStream.close();
                raf.close();
                System.out.println("第" + threadId + "個線程下載完畢了");

            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved