天天看点

android实现下载的核心代码

一:使用多线程实现下载

    private EditText etpath;//服务地址

    private LinearLayout ll ;

    // 访问服务器

    String path ;

    // 设定线程的数量

    int threadcount = 3;

    //定义正在执行的线程数量

    int runningThreadcount = threadcount ;   

    //建一个集合存放进度条

    List<ProgressBar> list = new ArrayList<ProgressBar>() ;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        etpath = (EditText) findViewById(R.id.etpath);       

        ll = (LinearLayout) findViewById(R.id.ll) ;   

        // 加载进度条控件

        for (int i = 0; i < threadcount; i++) {

            ProgressBar pb = (ProgressBar)View.inflate(this, R.layout.pb, null) ;           

        }

    }

    public void download(View view){

        //将进度条加入到线性组件中显示出来

        for(int i = 0; i < threadcount; i++){

        ll.addView(list.get(i));}

        new Thread() {

            public void run() {

                path = etpath.getText().toString().trim();

                if (TextUtils.isEmpty(path)) {

                    runOnUiThread(new Runnable() {

                        @Override

                        public void run() {

                            Toast.makeText(MainActivity.this, "路径不能为空", 0)

                                    .show();

                        }

                    });

                    return;

                }

                // 下载文件

                try {

                    // 创建连接服务器对象

                    URL url = new URL(path);

                    HttpURLConnection http = (HttpURLConnection) url

                            .openConnection();

                    // 设定连接参数

                    http.setRequestMethod("GET");

                    // 设定连接的超时时间

                    http.setConnectTimeout(5000);

                    // 获取返回的状态吗

                    int code = http.getResponseCode();

                    if (code == 200) {

                        // 获得返回的文件的大小

                        int length = http.getContentLength();

                        // 2.创建一个文件和下载的文件大小一样

                        RandomAccessFile raf = new RandomAccessFile(

                                getFileName(path), "rw");

                        // 设置文件的大小

                        raf.setLength(length);

                        // 3.启动多个线程下载文件

                        for (int id = 0; id < threadcount; id++) {

                            // 计算每个线程要下载的区块大小

                            int blocksize = length / threadcount;

                            // 计算每个线程下载的开始和结束位置

                            int startIndex = id * blocksize;

                            int endIndex = (id + 1) * blocksize - 1;

                            // 特殊情况:最后一个线程需要承担更多的数据

                            if (id == threadcount - 1) {

                                endIndex = length - 1;

                            }

                            // 启动线程下载数据

                            DownLoadThread dlt = new DownLoadThread(path, id,

                                    startIndex, endIndex);

                            dlt.start();

                    }

                } catch (Exception e) {

                    e.printStackTrace();

                            Toast.makeText(MainActivity.this, "网络连接错误", 0).show() ;

                    }) ;

                }

            };

        }.start();

}