Android断点续传核心代码

本文介绍了一种基于Android平台的断点续传实现方法。通过分析远程文件大小并记录已下载部分,实现了从上次断开的地方继续下载的功能。文中详细展示了如何使用HTTP请求设置断点续传,并提供了关键代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.android-study.com/wangluobiancheng/280.html


/**
 * 断 点 续 传
 * 
 * @param url
 */
private void duanDianXuChuan(final String url) {
    try {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                getRemoteFile(url);
            }
        };
        new Thread(r).start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * 下载远端文件
 * 
 * @param urlString
 */
private void getRemoteFile(String urlString){
    try{
        File file;
        if(mCurSize == 0){
            file = File.createTempFile(fileNa, fileEx);
            currentTempFilePath = file.getAbsolutePath();
            Log.e("andy",file.getName() + " has exists.");
        } else {
            file = new File(currentTempFilePath);
            FileInputStream fis = new FileInputStream(file);
            mCurSize = fis.available();
            Log.e("andy",file.getName() + " has " + mCurSize + " bytes.");
        }
        URL url = new URL(urlString);
        HttpURLConnection httpConnection = (HttpURLConnection) url
        .openConnection();
        httpConnection.setRequestProperty(“User-Agent”, “NetFox”);
        String sProperty = "bytes=" + mCurSize + "-";
        httpConnection.setRequestProperty("RANGE", sProperty);
        InputStream is = httpConnection.getInputStream();
        Log.e("andy","mTempFileName = " + mTempFileName);
        
        FileOutputStream fos = new FileOutputStream(file, true);
        byte buf[] = new byte[512];
        do
        {
            int numread = is.read(buf);
            if (numread <= 0)="" {="" mhandler.sendemptymessagedelayed(this.download_finish,="" 0);="" break;="" }="" mcursize="" +="numread;" mhandler.sendemptymessagedelayed(this.update_download_progress,="" 0);="" log.e("andy","current="" size=" + mCurSize);
            fos.write(buf, 0, numread);
        }while (mContinue);
        
        if(mCurSize == mSize) {
            mCurSize = 0;
            openFile(file);
        }
    try
    {
        is.close();
    }
    catch (Exception ex)
    {
        Log.e(" andy",="" "error:="" "="" +="" ex.getmessage(),="" ex);="" }="" }catch(exception="" e){="" e.printstacktrace();="" }="" }="" *="" *="" 获得文件长度="" *="" *="" @param="" urlstring="" *="" @return="" */="" public="" long="" getfilesize(string="" urlstring)="" {="" int="" nfilelength="-1;" try="" {="" url="" url="new" url(urlstring);="" httpurlconnection="" httpconnection="(HttpURLConnection)" url="" .openconnection();="" httpconnection.setrequestproperty("user-agent",="" "netfox");="" int="" responsecode="httpConnection.getResponseCode();" if="" (responsecode="">= 400) {
        return -2; // -2 represent access is error
    }
    String sHeader;
    for (int i = 1;; i++) {
        sHeader = httpConnection.getHeaderFieldKey(i);
        if (sHeader != null) {
            if (sHeader.equals("content-length")) {
                nFileLength = Integer.parseInt(httpConnection
                .getHeaderField(sHeader));
                break;
            }
        } else
            break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return nFileLength;
}

/**
 * 计算百分比
 * 
 * @param p1
 * @param p2
 * @return
 */
public static String percent(double p1, double p2) {
    String str;
    double p3 = p1 / p2;
    NumberFormat nf = NumberFormat.getPercentInstance();
    nf.setMinimumFractionDigits(2);
    str = nf.format(p3);
    Log.e("andy","percentage = " + str);
    return str;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值