Android下载通用类

下面是整个帮助类:

DownLoad.java
package sRoger.pack;

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.DecimalFormat;

import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class DownLoad 
{
    private String strUrl = "";
    private DownLoadCallBack mCallback = null;
    private MHandler mHandler = null;
    private Thread thread = null;
    private String fileName = "";
    private int len = 0;    // 下载文件总长度
    private int total = 0;    // 当前下载的长度
    
    /**
     * 构造函数
     * @param url URL
     */
    public DownLoad(String url,String fileName,DownLoadCallBack callBack)
    {
        this.strUrl = url;
        this.mCallback = callBack;
        this.fileName = fileName;
    }
    
    /**
     * 下载文件
     */
    public void DownLoadFile()
    {
        mHandler = new MHandler();
        thread = new Thread(runnable);
        thread.start();
    }
    
    Runnable runnable = new Runnable()
    {
        @Override
        public void run() 
        {
            try 
            {
                URL url = new URL(strUrl);
                HttpURLConnection con = (HttpURLConnection)url.openConnection();
                len = con.getContentLength();
                SendMsg("maxLen", len);
                InputStream inStream = new BufferedInputStream(con.getInputStream());
                String path = Environment.getExternalStorageDirectory().getAbsolutePath();
                OutputStream outStream = new FileOutputStream(path + "/mMusic/"+fileName);
                byte[] buffer = new byte[10240];
                int count = 0;
                total = 0;
                DecimalFormat format = new DecimalFormat("#0.00");
                while((count = inStream.read(buffer)) != -1)
                {
                    total += count;
                    outStream.write(buffer,0,count);
                    SendMsg("currentVal", total);
                    double tLen = Double.valueOf(String.valueOf(len));
                    double tDownTotal = Double.valueOf(String.valueOf(total));
                    double tPercent = tDownTotal / tLen * 100;
                    String tStrPercent = format.format(tPercent);
                    SendMsg("percent", tStrPercent);
                }
                outStream.flush();
                outStream.close();
                inStream.close();
                if(len == total)
                {
                    SendMsg("success", 0);
                }
                else
                {
                    SendMsg("error", -1);
                }
            }
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }
    };
    
    final class MHandler extends Handler
    {
        public MHandler() 
        {
            
        }
        
        public MHandler(Looper l)
        {
            super(l);
        }
        
        @Override
        public void handleMessage(Message msg) 
        {
            try
            {
                super.handleMessage(msg);
                Bundle data = msg.getData();
                if(data.containsKey("currentVal"))
                {
                    int val = data.getInt("currentVal");
                    mCallback.UpdateUIProgress(val);
                }
                if(data.containsKey("maxLen"))
                {
                    int val = data.getInt("maxLen");
                    mCallback.SetMaxProgress(val);
                    
                }
                if(data.containsKey("percent"))
                {
                    mCallback.ReturnPercent(data.getString("percent"));
                }
                if(data.containsKey("success"))
                {
                    mCallback.Success();
                    StopThread();
                }
                if(data.containsKey("error"))
                {
                    mCallback.Error();
                    StopThread();
                }
            }
            catch(Exception e)
            {
                StopThread();
            }
        }
    }
    
    /**
     * 向Handler发送消息
     * @param key 键
     * @param val 值
     */
    private void SendMsg(String key,int val)
    {
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putInt(key, val);
        msg.setData(data);
        wl("-->"+key+val);
        mHandler.sendMessage(msg);
    }
    
    /**
     * 向Handler发送消息
     * @param key 键
     * @param val 值
     */
    private void SendMsg(String key,String val)
    {
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putString(key, val+"%");
        msg.setData(data);
        wl("-->"+key+val);
        mHandler.sendMessage(msg);
    }
    
    /**
     * 停止下载
     */
    public void StopThread()
    {
        if(thread != null)
        {
            Thread t = thread;
            thread = null;
            t.interrupt();
        }
        wl("StopThread");
    }
    
    /**
     * 写log
     * @param strLog
     */
    private void wl(String strLog)
    {
        Log.i("sjr",strLog);
    }
}

 回调接口:

CallBackInterface.java
package sRoger.pack;

/**
 * 下载回调接口
 * @author SJR
 */
public interface DownLoadCallBack 
{
    /**
     * 更新进度条
     */
    void UpdateUIProgress(int cur);
    
    /**
     * 设置百分比
     * @param percent 当前下载的百分比
     */
    void ReturnPercent(String percent);
    
    /**
     * 设置进度条最大值
     * @param val
     */
    void SetMaxProgress(int val);
    
    /**
     * 下载完成
     */
    void Success();
    
    /**
     * 下载出错
     */
    void Error();
}

 

调用:

调用
String url = "http://zhangmenshiting5.baidu.com/data2/music/1837238/2460371341806461.mp3?xcode=74d240eb72f4e01b578f247b5baed415&lid=0";
                DownLoad dl = new DownLoad(url,"xyzth.mp3", new CallBack());
                dl.DownLoadFile();

 

实现回调接口:

实现回调接口
/**
     * 回调接口的实现
     * @author SJR
     */
    final class CallBack implements DownLoadCallBack
    {
        @Override
        public void UpdateUIProgress(int cur) 
        {
            setTitle("线程执行了");
            sb.setProgress(cur);
        }

        @Override
        public void SetMaxProgress(int val) 
        {
            sb.setMax(val);
        }

        @Override
        public void Success() {
            setTitle("下载完成!");
        }

        @Override
        public void Error() {
            setTitle("下载出错!");
        }

        @Override
        public void ReturnPercent(String percent) {
            tv_kb_state.setText(percent);
        }
    }

 

要想从网络上下载文件到本地内存卡上还要在AndroidManifest.xml中的<Application>节之前或之后添加以下配置内容:

AndroidManifast.xml
<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

 参考:http://www.android-study.com/wangluobiancheng/155.html

转载于:https://www.cnblogs.com/jRoger/articles/2585132.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值