1. 程式人生 > >多執行緒下載圖片的簡單例子

多執行緒下載圖片的簡單例子

原文

package com.example.kirito.myapplication.testdownload;

import android.os.Environment;
import android.os.Handler;
import android.os.Message;

import java.io.File;
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 java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * Created by kirito on 2016.10.25.
 */

public class DownLoadHelp {
    //建立執行緒池
    private Executor threadPool = Executors.newFixedThreadPool(3);
    private Handler handler;

    public DownLoadHelp(Handler handler) {
        this.handler = handler;
    }

    static class downRunnable implements Runnable{
        private String url;
        private String filename;
        private long start;
        private long end;
        private Handler handler;

        public downRunnable(String url, String filename, long start, long end,Handler handler) {
            this.url = url;
            this.filename = filename;
            this.start = start;
            this.end = end;
            this.handler = handler;
        }

        @Override
        public void run() {
            HttpURLConnection con = null;
            try {
                URL urls = new URL(url);
                con = (HttpURLConnection) urls.openConnection();
                con.setRequestMethod("GET");
                con.setReadTimeout(5000);
                con.setRequestProperty("Range","bytes="+start+"-" + end);

                RandomAccessFile accessFile = new RandomAccessFile(new File(filename),"rwd");
                accessFile.seek(start);

                InputStream is = con.getInputStream();
                byte bt[] = new byte[4 * 1024];
                int len = 0;
                while ((len = is.read(bt)) != -1){
                    accessFile.write(bt,0,len);
                }
                Message msg = new Message();
                msg.what = 1;
                handler.sendMessage(msg);
                if (accessFile != null){
                    accessFile.close();
                }
                if (is != null){
                    is.close();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if (con != null){
                    con.disconnect();
                }
            }
        }
    }

    public void downLoadFile(String purl){
        HttpURLConnection con = null;
        try {
            URL url = new URL(purl);
            con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.setReadTimeout(5000);

            long length = con.getContentLength();
            long block = length / 3;

            String fileName = getFileName(purl);
            File parent = Environment.getExternalStorageDirectory();
            File downLoadFile = new File(parent,fileName);
            /**
             * 若length = 35,35/3=11
             * i = 0,0-10
             * i = 1,11-21
             * i = 2,22-35(因為有for迴圈裡的if語句)
             */
            for (int i = 0; i < 3; i++) {
                long start = i * block;
                long end = (i + 1) * block - 1;
                if (i == 2){
                    end = length;
                }

                downRunnable runnable = new downRunnable(purl,downLoadFile.getAbsolutePath(),start,end,handler);
                threadPool.execute(runnable);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (con != null){
                con.disconnect();
            }
        }

    }
    //獲取URL裡圖片的名字
    private String getFileName(String url){
        return url.substring(url.lastIndexOf('/') + 1);
    }
}

測試介面
package com.example.kirito.myapplication.testdownload;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.kirito.myapplication.R;

/**
 * Created by kirito on 2016.10.25.
 */

public class TestDownLoad extends AppCompatActivity {
    private Button btn;
    private TextView tv;
    private int count;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            count += msg.what;
            if (count == 3){
                tv.setText("download success!");
            }
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testgosn);

        btn = (Button) findViewById(R.id.td_btn);
        tv = (TextView) findViewById(R.id.td_tv);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        DownLoadHelp downLoadHelp = new DownLoadHelp(handler);
                        downLoadHelp.downLoadFile("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2980880098,337923771&fm=116&gp=0.jpg");
                    }
                }).start();
            }
        });
    }
}