多线程下载

写了一个多线程下载的demo分享一下:

<pre name="code" class="java">package com.example.administrator.demo;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;


/**
 * Created by Administrator on 2015/10/15.
 */
public class LoadDown implements DownThread.DownListener{
    private int fileSize;
    private int threadSize = 3;
    private File saveFile;
    public static  final  String TAG = "LoadDown";
    public long startTime = 0;

    /**
     *判段sb卡状态
     *
     * @return
     */
    public static boolean sdMounted() {
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    }

    /**
     *判断wifi是否开启
     *
     * @return
     */
    public static boolean internetConnected(Context context) {
        if (context != null) {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (info != null) {
                return info.isConnected();
            }
        }
        return false;
    }

    /**
     * 下载文件
     * @param urlString 文件地址
     * @param context 上下文
     * @param downPath 要下载的路径
     */
    public void dowmLoad(String urlString, Context context, String downPath) {
        if (!sdMounted() || !internetConnected(context)) {
            return;
        }
        File file = new File(downPath);
        if (!file.exists()) {
            file.mkdirs();
        }

        try {
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(5 * 1000);
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Accept-Language", "zh-CN");
            connection.setRequestProperty("Connection", "Keep-Alive");
            connection.connect();
            if (connection.getResponseCode() == 200) {
                fileSize = connection.getContentLength();
                connection.disconnect();
                String fileName = urlString.substring(urlString.lastIndexOf("/"), urlString.length());
                saveFile = new File(file, fileName);
                int block = fileSize/threadSize;//每个线程要下载的部分
                int offset = fileSize % threadSize;//多出的部分
                for (int index = 0; index < threadSize; index ++){
                    if (index!=threadSize-1){
                        new DownThread(block*index,block,saveFile,url,index,this).start();
                    }else {
                        new DownThread(block*index,block+offset,saveFile,url,index,this).start();
                    }
                }
                startTime = System.currentTimeMillis();

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onDown(int length, int id) {

    }
    private int count = 0;
    @Override
    public void onDownOver(int id) {

        synchronized (this){
            Log.i(TAG, id+"下载完成");
            count++;
            if (count==threadSize){
                long time = System.currentTimeMillis();
                Log.i(TAG,"结束时间"+time+"总共耗时"+(time-startTime));
            }
        }
    }
}


 
package com.example.administrator.demo;

import android.util.Log;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Created by Administrator on 2015/10/15.
 */
public class DownThread extends Thread {
    public static final String TAG = "DownThread";
    private int start;//开始的字节
    private int length;//要下的长度
    private File saveFile;//要保存的文件
    private URL downUrl;//下载链接
    private int id;//线程id
    private int downLength;//已经下载的字节
    private DownListener listener;

    public DownThread(int start, int length, File saveFile, URL downUrl, int id,DownListener listener) {
        this.downUrl = downUrl;
        this.saveFile = saveFile;
        this.start = start;
        this.length = length;
        this.id = id;
        this.listener = listener;
    }

    @Override
    public void run() {
        try {
            HttpURLConnection connection = (HttpURLConnection) downUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5 * 1000);
            connection.setRequestProperty("Connection", "Keep-Alive");
            int startPos = this.start;
            int endPos = this.start + length;
            connection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos);//设置下载的字节的范围
            InputStream is = connection.getInputStream();
            byte[] buffer = new byte[1024];
            int offset = -1;
            int count = 0;
            RandomAccessFile file = new RandomAccessFile(saveFile, "rwd");
            file.seek(startPos);
            while ((offset = is.read(buffer)) != -1) {
                file.write(buffer, 0, offset);
                downLength += offset;
                if (listener!=null){
                    listener.onDown(downLength,id);
                    Log.i(TAG, "thread" + id + ":" + downLength + ":" + count++ + ":" + offset);
                }

            }
            file.close();
            is.close();
            if (listener!=null) {
                listener.onDownOver(id);
                Log.i(TAG, id + "下载完成");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        super.run();
    }
    public interface  DownListener{
        void onDown(int length,int id);
        void onDownOver(int id);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值