Android断点续传详解和实例

本文详细介绍了Android中利用RandomAccessFile实现断点续传的原理和方法,通过分析RandomAccessFile的API,展示了如何创建HttpDownLoadFile类来完成文件的下载、暂停、恢复和取消功能,提供了具体的代码实例,并在Meizu M1 Metal Android 5.1设备上进行了测试。
摘要由CSDN通过智能技术生成

前言

作为一个拖延者晚期的人,真的是计划跟行动力很难直接挂上钩,最近又有了新的打算,所以博客还是需要好好整理一下.

这次主要是运用的RandomAccessFile类来做 断点续传这件事,我一贯喜欢代码简洁清晰,所以尽可能用最少的代码解决问题.


断点续传原理及使用

断点续传想必大家都不陌生,其中最常见的是视频的断点续传,在其他的文件下载中,我们有时候为了保证下载文件的完整性也会用到RandomAccessFile类。

RandomAccessFile主要是记录开始的位置,从而进行插入操作.
官方的翻译如下:

RandomAccessFile是不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至都没有用InputStream和OutputStream已经准备好的功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类.

附:RandomAccessFile类的api的地址

RandomAccessFile类API方法分析

  • 构造方法
    • RandomAccessFile(File file, String mode)
    • RandomAccessFile(String name, String mode)
  • 常用方法
    • 流关闭
      • close()
    • 获取文件的长度
      • length()
    • 设置文件的长度
      • setLength(long newLength)
    • 设置文件指针的开始偏移位置
      • seek(long pos)
    • 读操作
      • read()
      • read(byte[] b)
      • read(byte[] b, int off, int len)
    • 写操作
      • write(byte[] b)
      • write(byte[] b, int off, int len)

代码实例

在写实例之前,说一下现在要实现的功能以及实现的基本思路.

  • 功能
    • http下载文件,允许开始下载,暂停下载,恢复下载和取消下载
  • 实现思路.
    • 需要先获取该文件的大小,创建一个空的文件,然后向该文件中依次写入数据.
实现类 HttpDownLoadFile

(测试功能正常,机型:Meizu M1 Metal Android 5.1)

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 多线程下载文件
 */
public class HttpDownLoadFile {
   
    private static final String SP_NAME = "http_download_file";
    private static final String CURRENT_LENGTH = "current_length";

    //以下为线程状态
    private static final String DOWNLOAD_INIT = "1";//初始
    private static final String DOWNLOAD_ING = "2";//运行
    private static final String DOWNLOAD_PAUSE = "3";//暂停
    private String loadUrl;//网络获取的url
    private String filePath;//下载到本地的path
    private int fileLength;//文件总大小
    //使用volatile防止多线程不安全
    private volatile int currentLength;//当前总共下载的大小
    private Thread thread;
    private String stateDownload = DOWNLOAD_INIT;//当前线程状态
    private OnHttpDownLoadListener httpDownLoadListener;
    private final int SUCCESS = 0x00000101;
    private final int FAILURE = 0x00000102;
    private SharedPreferences sp;
    public void setOnHttpDownLoadListener(OnHttpDownLoadListener httpDownLoadListener) {
   
        this.httpDownLoadListener = httpDownLoadListener;
    }
    public interface OnHttpDownLoadListener {
   
        //返回当前下载进度的百分比
        void onProgress(int progress);
        void onComplete();
        void onFailure()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值