zoukankan      html  css  js  c++  java
  • 31_多线程断点下载器

    《FileDownloader》

    /**
     * 文件下载器
     * 
        try {
            FileDownloader loader = new FileDownloader(context, "http://browse.babasport.com/ejb3/ActivePort.exe",
                    new File("D:\androidsoft\test"), 2);
            loader.getFileSize();//得到文件总大小
            loader.download(new DownloadProgressListener(){
                    public void onDownloadSize(int size) {
                        print("已经下载:"+ size);
                    }            
                });
        } catch (Exception e) {
                e.printStackTrace();
        }
     */
    .......一下为实现代码。。。。。。。。。。。。

    <MainActivity.java>

            /*
            由于用户的输入事件(点击button, 触摸屏幕....)是由主线程负责处理的,如果主线程处于工作状态,
            此时用户产生的输入事件如果没能在5秒内得到处理,系统就会报“应用无响应”错误。
            所以在主线程里不能执行一件比较耗时的工作,否则会因主线程阻塞而无法处理用户的输入事件,
            导致“应用无响应”错误的出现。耗时的工作应该在子线程里执行。
             */
    private void download(String path, File saveDir) {//运行在主线程
                  task = new DownloadTask(path, saveDir);
                new Thread(task).start();
            }

    /  * UI控件画面的重绘(更新)是由主线程负责处理的,如果在子线程中更新UI控件的值,更新后的值不会重绘到屏幕上
       * 一定要在主线程里更新UI控件的值,这样才能在屏幕上显示出来,不能在子线程中更新UI控件的值——所以才有class UIHander
       */

            private final class DownloadTask implements Runnable{
                private String path;
                private File saveDir;
                private FileDownloader loader;
                public DownloadTask(String path, File saveDir) {
                    this.path = path;
                    this.saveDir = saveDir;
                }
                /**
                 * 退出下载
                 */
                public void exit(){
                    if(loader!=null) loader.exit();
                }
                
                //hanlder的作用是用于往创建Hander对象所在的线程所绑定的消息队列发送消息

              // UI控件画面的重绘(更新)是由主线程负责处理的,如果在子线程中更新UI控件的值,更新后的值不会重绘到屏幕上
               // 一定要在主线程里更新UI控件的值,这样才能在屏幕上显示出来,不能在子线程中更新UI控件的值——所以要sendMessage使用UIHander类处理

          public class MainActivity extends Activity {
        private Handler handler = new UIHander();
    public void run() { try { loader = new FileDownloader(getApplicationContext(), path, saveDir, 3); progressBar.setMax(loader.getFileSize());//设置进度条的最大刻度 loader.download(new DownloadProgressListener() { public void onDownloadSize(int size) { Message msg = new Message();                msg.what = 1;                msg.getData().putInt("size", size);                handler.sendMessage(msg); } }); } catch (Exception e) { e.printStackTrace(); handler.sendMessage(handler.obtainMessage(-1)); } } }
     
    private final class UIHander extends Handler{
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case 1:
                    int size = msg.getData().getInt("size");
                    progressBar.setProgress(size);
                    float num = (float)progressBar.getProgress() / (float)progressBar.getMax();
                    int result = (int)(num * 100);
                    resultView.setText(result+ "%");
                    if(progressBar.getProgress() == progressBar.getMax()){
                        Toast.makeText(getApplicationContext(), R.string.success, 1).show();
                    }
                    break;
    
                case -1:
                    Toast.makeText(getApplicationContext(), R.string.error, 1).show();
                    break;
                }
            }
        }
  • 相关阅读:
    第十三周学习进度
    第二次冲刺阶段每日任务02
    第二次冲刺阶段每日任务01
    构建之法阅读笔记03
    找水王续
    第十二周学习进度
    找水王
    第十一周学习进度
    博客园的用户体验
    找水王1
  • 原文地址:https://www.cnblogs.com/carl2380/p/4166889.html
Copyright © 2011-2022 走看看