Android 多线程下载文件原理霸气解析介绍 -----文件的下载(3)

本文介绍了Android中如何实现多线程下载文件,包括创建下载位置、使用OkHttp进行网络请求、单线程下载的实现,以及多线程下载的管理类设计。通过创建线程池,将文件总长度平分到每个线程,利用RandomAccessFile在指定位置写入数据,实现多线程同步下载。最后给出了多线程下载的使用示例。
摘要由CSDN通过智能技术生成

1、首先我们先创建好下载的位置–根据url创建文件。

  /**
 * <p>Title: FlieStorageManager</p >
 * <p>Description: TODO</p >
 * <p>Company: ihaveu</p >
 *
 * @author MaWei
 * @date 2018/2/5
 */
public class FlieStorageManager {
   

    public static FlieStorageManager sManager = new FlieStorageManager();

    private Context mContext;

    public static FlieStorageManager getInstance(){
        return sManager;
    }

    public void init(Context mContext){
        this.mContext = mContext;
    }

    public FlieStorageManager() {
    }

    /**
     * 根据url 设置文件名返回文件
     * @param url
     * @return
     */
    public File getFileByName(String url){
        File parent;
        // 判断手机有没有挂载SD卡
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            // 通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
            parent = mContext.getExternalCacheDir();
        }else {
            // 没有SD卡保存在系统目录的cache下
            parent = mContext.getCacheDir();
        }

        String fileName = Md5Uills.generateCode(url);
        // 路径、 文件名
        File file = new File(parent, fileName);
        if(!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return file;
    }

}

我们的路径很明显放在的cach目录下。

那么我们简单封装一下okhttp联网的框架的几个请求。
然后给大家看一下简单的单线程下载是怎么实现的

/**
 * <p>Title: HttpManager</p >
 * <p>Description: 联网请求工具类</p >
 * <p>Company: ihaveu</p >
 *
 * @author MaWei
 * @date 2018/2/5
 */
public class HttpManager {
   

    public static HttpManager mManager = new HttpManager();
    /** 请求失败*/
    public static final int NETWORK_ERROR_CODE = 1;
    /** 获取不到文件的总长度*/
    public static final int CONTENT_LENGTH_ERROR_CODE = 2;
    /** 队列中存在下载的任务*/
    public static final int TASK_RUNNING_ERROR_CODE = 3;
    /** okhttp请求类*/
    private OkHttpClient mClient;
    private Context mContext;

    private void init(Context mContext){
        this.mContext = mContext;
  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值