基于Android 下载文件时,更新UI简单帮助类

由于在项目开发时,有这样的简单需求,问谷歌,网络上也有好多Utils工具类,但是比较冗余。自己就简单的写了一个简单帮助类。


/**
 * 下载文件,更新UI简单帮助类
 *
 * @author jarlen
 *
 */
public class DownLoadHelper
{
    private static final int DOWN_BEGIN = 0;
    private static final int DOWN_UPDATA = 1;
    private static final int DOWN_FINISH = 2;
    private static final int DOWN_ERROR = 3;

    private Context mContext;

    private TextView mTextView;

    private ProgressBar mBar;

    private Handler handler = new Handler()
    {
        public void handleMessage(Message msg)
        {
            if (!Thread.currentThread().isInterrupted())
            {
                switch (msg.what)
                {
                case DOWN_BEGIN:
                    if (mTextView != null)
                    {
                        mTextView.setText("开始下载");
                    }

                    if(mBar != null)
                    {
                        mBar.setProgress(0);
                    }

                    break;
                case DOWN_UPDATA:
                    int factor = msg.arg1;

                    if (mTextView != null)
                    {
                        mTextView.setText(factor + "%");
                    }

                    if(mBar != null)
                    {
                        mBar.setProgress(factor);
                    }

                    break;

                case DOWN_FINISH:
                    if (mTextView != null)
                    {
                        mTextView.setText("下载完成");
                    }

                    if(mBar != null)
                    {
                        mBar.setProgress(100);
                    }

                    break;
                case DOWN_ERROR:
                    if (mTextView != null)
                    {
                        mTextView.setText("下载错误");
                    }

                    if(mBar != null)
                    {
                        mBar.setProgress(0);
                    }

                    break;

                default:
                    break;
                }
            }
        };
    };

    public DownLoadHelper(Context context)
    {
        this.mContext = context;
    }

    /**
     * 设置下载时,需要更新的UI TextView
     * @param view
     */
    public void setUpdataView(TextView view)
    {
        this.mTextView = view;
    }

    /**
     * 设置下载时,需要更新的UI,ProgressBar
     * @param bar
     */
    public void setUpdataBar(ProgressBar bar)
    {
        this.mBar = bar;
    }

    /**
     * 开始下载
     * @param url
     * 文件下载地址
     * @param path
     * 文件保存地址
     */
    public void startDownLoad(final String url, final String path)
    {

        new Thread()
        {
            public void run()
            {
                sendMsg(DOWN_BEGIN, 0);
                try
                {
                    long downloadSize = downloadUpdateFile(url, path);
                    if (downloadSize > 0)
                    {
                        sendMsg(DOWN_FINISH, 0);
                    }
                } catch (Exception e)
                {
                    e.printStackTrace();
                    sendMsg(DOWN_ERROR, 0);
                }

            };
        }.start();
    }

    private long downloadUpdateFile(String down_url, String path)
            throws Exception
    {
        int down_step = 1;// 提示step
        int totalSize;// 文件总大小
        int downloadCount = 0;// 已经下载好的大小
        int updateCount = 0;// 已经上传的文件大小
        InputStream inputStream;
        OutputStream outputStream;
        URL url = new URL(down_url);
        HttpURLConnection httpURLConnection = (HttpURLConnection) url
                .openConnection();
        httpURLConnection.setConnectTimeout(30 * 1000);
        httpURLConnection.setReadTimeout(30 * 1000);
        // 获取下载文件的size
        totalSize = httpURLConnection.getContentLength();
        if (httpURLConnection.getResponseCode() == 404)
        {
            sendMsg(DOWN_ERROR, 0);
            throw new Exception("fail!");
        }
        inputStream = httpURLConnection.getInputStream();
        File dir = new File(path);
        if (!dir.exists())
        {
            dir.mkdir();
        }
        String name = down_url.substring(down_url.lastIndexOf("/") + 1,
                down_url.length());

        File updateFile = new File(dir, name);
        outputStream = new FileOutputStream(updateFile, false);// 文件存在则覆盖掉
        byte buffer[] = new byte[1024];
        int readsize = 0;
        while ((readsize = inputStream.read(buffer)) != -1)
        {
            outputStream.write(buffer, 0, readsize);
            downloadCount += readsize;// 时时获取下载到的大小
            // 每次增长1%
            if (updateCount == 0
                    || (downloadCount * 100 / totalSize - down_step) >= updateCount)
            {
                updateCount += down_step;
                sendMsg(DOWN_UPDATA, updateCount);

            }
        }
        if (httpURLConnection != null)
        {
            httpURLConnection.disconnect();
        }
        inputStream.close();
        outputStream.close();
        return downloadCount;
    }

    private void sendMsg(int flag, int factor)
    {
        Message msg = new Message();
        switch (flag)
        {

        case DOWN_BEGIN:// 开始
        case DOWN_FINISH:// 完成
        case DOWN_ERROR:// 失败

            break;
        case DOWN_UPDATA:// 更新进度条
            msg.arg1 = factor;
            break;

        default:
            break;
        }
        msg.what = flag;
        handler.sendMessage(msg);
    }

}

使用时简单说明下;

DownLoadHelper helper1 = new DownLoadHelper(this);
helper1.setUpdataView(tv1);
helper1.startDownLoad("http://img1.2345.com/appsimg/wallpaper/4/139460306960.jpg", path);

/********************************************/

Demo源码下载地址

http://download.csdn.net/detail/jarlen/8552443

没有认真地检查,可能有bug,使用的伙伴请自己debug下,并通知我一下,谢谢

时间: 2024-08-06 16:05:34

基于Android 下载文件时,更新UI简单帮助类的相关文章

基于Android下载并解压Zip文件,更新UI简单帮助类

类似于:http://blog.csdn.net/jarlen/article/details/44794031 下载文件: /** * 下载文件 * * @param down_url * @param output * @param tmpDir */ private void download(String down_url, File output, File tmpDir) { InputStream inputStream = null; OutputStream outputStr

安卓下载文件怎样更新UI进度

曾经写过几篇关于下载的文章.总的来说是下面几点: 1.维护一个下载进程的Hashmap,key:使用Md5进行处理后的文件下载地址,value为下载的Task. 以防止下载反复.并将信息保存至数据库. 2.下载线程Task继承自Runnable,使用RandomAccessFile来保证能够断点下载. 3.下载时使用ContentProvider的Observer进行通知UI或使用Listener监听器通知,当然也能够是BroadCast. 反编译过非常多的apk.并查看下载模块,使用Liste

安卓下载文件如何更新UI进度

以前写过几篇关于下载的文章,总的来说是以下几点: 1.维护一个下载进程的Hashmap,key:使用Md5进行处理后的文件下载地址,value为下载的Task.以防止下载重复,并将信息保存至数据库. 2.下载线程Task继承自Runnable,使用RandomAccessFile来保证可以断点下载. 3.下载时使用ContentProvider的Observer进行通知UI或使用Listener监听器通知,当然也可以是BroadCast. 反编译过很多的apk,并查看下载模块,使用Listene

正确处理下载文件时HTTP头的编码问题(Content-Disposition)

转自:https://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/ 最近在做项目时遇到了一个 case :需要实现一个强制下载功能(即强制弹出下载对话框,阻止浏览器尝试解析显示某些文件格式),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符). 前一个需求很容易实现:使用 HTTP Header 的 Content-Disposition: attachment 即可,还可

Android下载文件常见错误解决方法

最近在学习Mars老师的Android开发课程,仿照http://www.cnblogs.com/Laupaul/archive/2012/02/12/2348293.html的代码来写应用,结果中间出了各种各样的问题,在这里总结一下: 1. java.lang.NullPointerException报错,android.os.NetworkOnMainThreadException异常 原因:urlCon.getInputStream()执行的时候出错导致,得不到InputStream.这个

【转】正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)

最近在做项目时遇到了一个 case :需要实现一个强制在浏览器中的下载功能(即强制让浏览器弹出下载对话框),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符). 前一个需求很容易实现:使用 HTTP Header 的 Content-Disposition: attachment 即可,还可以配合 Content-Type: application/octet-stream 来确保万无一失.而后一个需求就比较蛋疼了,牵扯到 Header 的编码问题(文件名是作为 filena

实现在 .net 中使用 HttpClient 下载文件时显示进度

原文:实现在 .net 中使用 HttpClient 下载文件时显示进度 在 .net framework 中,要实现下载文件并显示进度的话,最简单的做法是使用 WebClient 类.订阅 DownloadProgressChanged 事件就行了. 但是很可惜,WebClient 并不包含在 .net standard 当中.在 .net standard 中,要进行 http 网络请求,我们用得更多的是 HttpClient.另外还要注意的是,UWP 中也有一个 HttpClient,虽然

[ASP.NET][C#]下载文件时中文文件名出现乱码

负责的网站在ASP.NET网页有一段下载Word/Excel文件的程序,最近使用者要求的文件名称内含繁体中文字, 同事用chrome/firefox浏览器测试下载都很正常显示,但用IE(版本11)开启时,却出现了乱码. 1.准备一个中文文件名的文件 ASP.NET MVC 2.在HomeControler中加入下载程序Download public ActionResult Download() { //文件位置 string filepath = @"E:testWebApplication1

Android线程间通信更新UI的方法(重点分析EventBus)

Android的UI更新只能在UI线程中,即主线程.子线程中如果要进行UI更新,都是要通知主线程来进行. 几种实现方式总结如下,欢迎补充. 1.runOnUiThread() 子线程中持有当前Activity引用(假如为Activity mActivity;),即可以调用mActivity的runOnUiThread(Runnable r)方法. 2.post()和postDelay() 子线程如果持有某个View的引用,要对该View进行更新,则可调用该View对象的post(Runnable