多线程下载

来源:互联网 发布:云计算教学视频百度云 编辑:程序博客网 时间:2024/06/09 12:14

//创建一个线程类

public class DownLoadTask extends Thread {
    String downLoadUrl;
    String path;
    int blockSize;
    long startPosition;

    public DownLoadTask(String downLoadUrl, String path, int blockSize, long startPosition) {
        this.downLoadUrl = downLoadUrl;
        this.path = path;
        this.blockSize = blockSize;
        this.startPosition = startPosition;
    }

    @Override
    public void run() {
        NetUtils.downLoadFile(downLoadUrl,path,blockSize,startPosition);
    }
}


//创建另一个线程类

public class DownLoadThread extends Thread {
    private String downLoadUrl="";
    private String path;
    private int threadNum=5;

    public DownLoadThread(String downLoadUrl, String path, int threadNum) {
        this.downLoadUrl = downLoadUrl;
        this.path = path;
        this.threadNum = threadNum;
    }

    @Override
    public void run() {
        int len=NetUtils.getFileLength(downLoadUrl);
        DialogUtils.MAX_SIZE=len;
        int blockSize=len/threadNum;
//        int blockSize= (int) Math.round(tempSize+0.5);
        for (int i = 0; i < threadNum; i++) {
            int startPosition = i * blockSize;
            if (i==threadNum-1){
                blockSize=len-blockSize*(threadNum-1);
            }
//            new DownLoadTask(downLoadUrl,path,blockSize,i).start();
            new DownLoadTask(downLoadUrl,path,blockSize,startPosition).start();
        }
    }
}

//创建一个工具类

public class NetUtils {
    public static void downLoadFile(String downloadUrl,String path,int blockSize,long startPosition) {
        BufferedInputStream bis=null;
        RandomAccessFile raf=null;
        try {
            File file=new File(path);
            if (!file.exists()){
                file.createNewFile();
            }
            URL url=new URL(downloadUrl);
            HttpURLConnection conn= (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(5000);
            conn.setConnectTimeout(5000);
            if (blockSize>0){

                long end=blockSize + startPosition - 1;
                conn.setRequestProperty("Range","bytes="+startPosition+"-"+end);
                Log.i(Thread.currentThread()+"===========", "bytes="+startPosition+"-"+end);
            }
            int code=conn.getResponseCode();
            if (code<400){
                bis=new BufferedInputStream(conn.getInputStream());
                raf=new RandomAccessFile(file,"rwd");
                raf.seek(startPosition);
                int len=0;
                byte[] buff=new byte[1024*8];
                while ((len=bis.read(buff))!=-1){
                    synchronized (NetUtils.class){
                        raf.write(buff,0,len);
                        DialogUtils.PROGRESS+=len;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bis!=null){
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (raf!=null){
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static int getFileLength(String downLoadUrl){
        int len=0;
        try {
            URL url=new URL(downLoadUrl);
            HttpURLConnection conn= (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(5000);
            conn.setConnectTimeout(5000);
            len=conn.getContentLength();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return len;
    }
}


//创建另一个工具类

public class DialogUtils {
    public static int MAX_SIZE=0;
    public static int PROGRESS=0;

    public static void showUpdataDialog(final Context context){
        AlertDialog.Builder builder=new AlertDialog.Builder(context);
        builder.setTitle("是否更新")
                .setMessage("太久了,更新吧")
                .setNegativeButton("No",null)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        new DownLoadThread("http://169.254.32.59:8080/c.png",context.getCacheDir()+"/c.png",5).start();
                        showProgress(context);
                    }
                }).show();
    }
    public static void showProgress(final Context context){
        final ProgressDialog pd=new ProgressDialog(context);
        pd.setTitle("正在更新");
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setMax(100);
        pd.show();
        new AsyncTask<String,Integer,String>(){
            @Override
            protected String doInBackground(String... strings) {
                while (PROGRESS<MAX_SIZE){
                    SystemClock.sleep(100);
                    publishProgress((int)(PROGRESS*100/MAX_SIZE));
                }
                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                pd.dismiss();
            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                pd.setProgress(values[0]);
            }
        }.execute();
    }
}


//主Activity里调用方法

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DialogUtils.showUpdataDialog(this);
    }
}


原创粉丝点击