Android 断点续传基础之单线程下载

**遇到的问题:**在这因为返回值的问题烦躁了一下,有可能出现空指针的异常,已经提出成文章了

请参考http://blog.csdn.net/qq_27489007/article/details/53523378

文件关系图

断点续传流程图

开始撸代码(主要代码)

/**

  • 普通断点续传

*/

public class DuandianActivity extends AppCompatActivity {

@BindView(R.id.tv)

TextView tv;

@BindView(R.id.probar)

ProgressBar probar;

@BindView(R.id.btstar)

Button btstar;

@BindView(R.id.btstop)

Button btstop;

String url = “http://dldir1.qq.com/weixin/android/weixin6316android780.apk”;

private FileInfo fileInfo;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_duandian);

ButterKnife.bind(this);

probar.setMax(100);

//创建文件信息对象

fileInfo = new FileInfo(0, url, “文件名-下载进度”, 0, 0);

tv.setText(fileInfo.getFileName()); //设置显示下载的文件名

//注册广播接收器

IntentFilter filter = new IntentFilter();

filter.addAction(DownloadService.ACTION_UPDATE);

registerReceiver(mReceiver, filter);

}

//更新ui的广播接收器

BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

if (DownloadService.ACTION_UPDATE.equals(intent.getAction())) {

int finished = intent.getIntExtra(“finished”, 0);

probar.setProgress(finished);

if (probar.getProgress()==100){

Toast.makeText(DuandianActivity.this,“下载完成!”,Toast.LENGTH_SHORT).show();

}

}

}

};

//按钮事件监听

@OnClick({R.id.btstar, R.id.btstop})

public void onClick(View view) {

Intent intent = new Intent(DuandianActivity.this, DownloadService.class);

switch (view.getId()) {

case R.id.btstar:

//通过intent传递参数给service

intent.setAction(DownloadService.ACTION_START);

intent.putExtra(“fileInfo”, fileInfo);

Log.i(“TAG”,intent.getAction().toString());

startService(intent);

break;

case R.id.btstop:

intent.setAction(DownloadService.ACTION_STOP);

intent.putExtra(“fileInfo”, fileInfo);

startService(intent);

break;

}

}

@Override

protected void onDestroy() {

super.onDestroy();

if (mReceiver != null) {

unregisterReceiver(mReceiver);

}

}

}

DownloadService.java

/**

  • 下载的服务类

*/

public class DownloadService extends Service {

public static final String ACTION_START = “ACTION_START”;

public static final String ACTION_STOP = “ACTION_STOP”;

public static final String ACTION_UPDATE = “ACTION_UPDATE”;

public static final String DOWNLOAD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + “/download”;//sd卡路径

private DownloadTask mDownloadTask = null;

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

// Log.i(“TAG”, intent.getAction().toString());

// Log.i(“action”, intent.getAction().toString());

//获得activity传来的参数

if (ACTION_START.equals(intent.getAction())) {

FileInfo fileInfo = (FileInfo) intent.getSerializableExtra(“fileInfo”);

Log.i(“test”, “start” + fileInfo.toString());

//启动初始化线程

new InitThread(fileInfo).start();

} else if (ACTION_STOP.equals(intent.getAction())) {

FileInfo fileInfo = (FileInfo) intent.getSerializableExtra(“fileInfo”);

Log.i(“test”, “stop” + fileInfo.toString());

if (mDownloadTask != null) {

mDownloadTask.isPause = true;

Toast.makeText(getApplicationContext(),“暂停成功”,Toast.LENGTH_SHORT).show();

}else {

Toast.makeText(getApplicationContext(),“还未开始下载”,Toast.LENGTH_SHORT).show();

}

}

return super.onStartCommand(intent, Service.START_REDELIVER_INTENT, startId);

}

@Override

public IBinder onBind(Intent intent) {

return null;

}

private static final int MSG_INIT = 0;

Handler mhandler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

switch (msg.what) {

case MSG_INIT:

FileInfo fileInfo = (FileInfo) msg.obj;

Log.i(“test”, “Init:” + fileInfo);

//启动下载任务

mDownloadTask = new DownloadTask(DownloadService.this, fileInfo);

mDownloadTask.download();

break;

}

}

};

/**

  • 子线程进行下载保存工作

  • 初始化子线程

*/

class InitThread extends Thread {

private FileInfo thread_fileInfo = null;

private RandomAccessFile raf;

public InitThread(FileInfo fileInfo) {

this.thread_fileInfo = fileInfo;

}

@Override

public void run() {

//连接网络文件

HttpURLConnection conn = null;

try {

URL url = new URL(thread_fileInfo.getUrl());

conn = (HttpURLConnection) url.openConnection();

conn.setRequestMethod(“GET”
);

conn.setConnectTimeout(3000);

int length = -1;

if (conn.getResponseCode() == 200) {

//获得文件长度

length = conn.getContentLength();

}

if (length <= 0) {

return;

}

File dir = new File(DOWNLOAD_PATH);

if (!dir.exists()) { //判断如果不存在则创建一个文件

dir.mkdir();

}

//在本地创建文件

File file = new File(dir, thread_fileInfo.getFileName());

//随机访问的文件 可以在文件的任意一个位置进行写入操作

//rwd可读可写可操作

raf = new RandomAccessFile(file, “rwd”);

//设置文件长度

raf.setLength(length);

thread_fileInfo.setLength(length);

mhandler.obtainMessage(MSG_INIT, thread_fileInfo).sendToTarget();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (conn != null && raf != null) {

raf.close(); //关闭文件操作

conn.disconnect(); //断掉链接

}

} catch (IOException e) {

e.printStackTrace();

}

}

super.run();

}

}

}

DownloadTask.java

/**

  • 下载的任务类 对文件的下载

  • Created by lung on 2016-12-07.

*/

public class DownloadTask {

private Context mContext = null;

private FileInfo mFileInfo = null;

private ThreadDAOImpl mThreadDAO = null;

private long mFinished = 0; //总的完成进度

public boolean isPause = false; //暂停下载的开关

public DownloadTask(Context mContext, FileInfo mFileInfo) {

this.mContext = mContext;

this.mFileInfo = mFileInfo;

mThreadDAO = new ThreadDAOImpl(mContext);

}

//下载的方法

public void download() {

//读取数据库的线程信息

List threaddInfos = mThreadDAO.getThreads(mFileInfo.getUrl());

TheardInfo info;

if (threaddInfos.size() == 0) { //如果数据库无线程信息

info = new TheardInfo(0, mFileInfo.getUrl(), 0, mFileInfo.getLength(), 0);

} else {

info = threaddInfos.get(0);//单线程的下载 所以使用get(0)

}

//创建子线程进行下载

new DownloadThread(info).start();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 生成文本工具推荐(AI 对话/AI 聊天机器人/AI 写作)

① boardmix AI boardmix AI&#xff0c;是一个在线的智能 AI 对话 App&#xff0c;打开浏览器即可在线使用&#xff0c;支持 AI 多轮连续对话&#xff0c;提供 AI 角色切换、AI 多语言翻译、一键唤出、可视化表达及多人协作功能。 boardmix AI 预置了多个不同的 AI 角色&…

⭐Unity 控制任意UI的渐隐渐显

使用脚本之前先给要控制的UI加上CanvasGroup组件 解释: 这个脚本使用协程来逐渐改变CanvasGroup的alpha值&#xff0c;从而实现渐隐和渐显的效果。 Mathf.Lerp函数用于在指定的时间内平滑地从当前透明度过渡到目标透明度。 通过调用FadeIn和FadeOut方法&#xff0c;你可以在任…

eNSP学习——配置DHCP中继

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置DHCP服务器 4、配置DHCP中继 5、配置PC获取地址方式为DHCP 主要命令 //配置指定DHCP服务器的方法 //方法一&#xff1a;在面向PC的接口下直接配置DHCP服…

CP AUTOSAR标准之LargeDataCOM(AUTOSAR_CP_SWS_LargeDataCOM)(更新中……)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块LdCom的功能、API和配置。   在AUTOSAR分层架构中,AUTOSAR LdCom模块位于RTE/SwCluC_LdComProxy和PDU路由之间,参见[1,EXP LayeredSoftwareArchitecture]。   AUTOSAR LdCom模块提供了一种替代的交互层机制。通过专注于…

Ubuntu 使用Vscode的一些技巧 ROS

Ubuntu VSCode的一些设置&#xff08;ROS&#xff09; 导入工作空间 推荐只导入工作空间下的src目录 如果将整个工作空间导入VSCode&#xff0c;那么这个src就变成了次级目录&#xff0c;容易在写程序的时候把本应该添加到具体工程src目录里的代码文件给误添加到这个catkin_w…

MySQL(5)

聚合函数 GROUP BY 的使用 需求&#xff1a;查询各个部门的平均工资&#xff0c;最高工资SELECT department_id,AVG(salary),SUM(salary)FROM employeesGROUP BY department_id;需求&#xff1a;查询各个job_id的平均工资SELECT job_id,AVG(salary)FROM employeesGROUP BY jo…

HTTP/3 协议学习

前一篇&#xff1a; HTTP/2 协议学习-CSDN博客 HTTP/3 协议介绍 HTTP/3 是互联网上用于传输超文本的协议 HTTP 的第三个主要版本。它是 HTTP/2 的后继者&#xff0c;旨在进一步提高网络性能和安全性。HTTP/3 与前两个版本的主要区别在于它使用了一个完全不同的底层传输协议—…

基于协同过滤算法的电影推荐

基于协同过滤算法的电影推荐 电影推荐系统使用了基于**协同过滤&#xff08;Collaborative Filtering&#xff09;的算法来生成推荐。具体来说&#xff0c;使用了基于用户的协同过滤&#xff08;User-Based Collaborative Filtering&#xff09;**算法&#xff0c;步骤如下&am…

【SCAU数据挖掘】数据挖掘期末总复习题库应用题及解析

1. 给定圆的半径为e &#xff0c;令 MinPts3&#xff0c;考虑下面两幅图。 &#xff08;1&#xff09;哪些对象是核心对象? m,p,o,r(因为这些核心对象在半径e的范围内都至少包含MinPts3个对象) &#xff08;2&#xff09;哪些对象是直接密度可达的? 对象q是…

Thermo Fisher赛默飞TSQ单杆电源维修1R120380-0001

美国热电质朴分析仪电路板维修&#xff0c;液相色谱质谱联用仪维修&#xff0c;Thermo Fisher赛默飞世尔光谱仪IS10 IS5赛默飞主板维修。 公司仪器维修设备备有三相交流电源,变频电源&#xff0c;无油空压气源&#xff0c;标准化的维修平台、电子负载&#xff0c;耐压测试仪、老…

MongoDB和AI 赋能行业应用:零售

欢迎阅读“MongoDB 和 AI 赋能行业应用”系列的第三篇。 本系列重点介绍 AI 应用于不同行业的关键用例&#xff0c;涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 利用生成式 AI 技术&#xff08;Gen AI&#xff09;&#xff0c;零售商可以创造…

软考中级哪个科目比较简单,只为拿证?

中级科目包括信息系统、计算机网络等5个方向&#xff0c;共计15门课程。软考中级难度适中&#xff0c;考取后即可获得中级职称&#xff0c;因此性价比最高。 需要留意的是&#xff0c;这些科目中&#xff0c;有一些是每年只有一次考试的&#xff0c;有一些是每年有两次考试的&a…

【机器学习】第2章 线性回归及最大熵模型

一、概念 1.回归就是用一条曲线对数据点进行拟合&#xff0c;该曲线称为最佳拟合曲线&#xff0c;这个拟合过程称为回归。 2.一个自变量 叫 一元线性回归&#xff0c;大于一个自变量 叫 多元线性回归。 &#xff08;1&#xff09;多元回归&#xff1a;两个x&#xff0c;一个…

qmt量化交易策略小白学习笔记第37期【qmt编程之指数数据--如何获取迅投商品市场指数行情数据】

qmt编程之获取商品市场指数数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取迅投商…

HPMicro:FEMC应用指南

先楫FEMC的基本概念介绍 FEMC (Flexible External Memory Controller)全称为多功能外部存储器控制器。作为并行接口控制器&#xff0c;FEMC具有访问存储数据速度快的特点。 HPM的FEMC只有一路&#xff0c;由于FEMC是并口&#xff0c;所以占用的管脚较多。而且HPM的FEMC信号引脚…

【面试干货】ArrayList、Vector、LinkedList的存储性能和特性比较

【面试干货】ArrayList、Vector、LinkedList的存储性能和特性比较 1、ArrayList1.1 存储性能1.2 特性1.3 示例用法 2、Vector2.1 存储性能2.2 特性2.3 示例用法 3、LinkedList3.1 存储性能3.2 特性3.3 示例用法 4、ArrayList、Vector、LinkedList用法总结 &#x1f496;The Beg…

Transformer革新:Infini-Transformer在长文本处理中的突破

在当今信息爆炸的时代&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在处理长文本数据方面的需求日益增长。无论是科学研究、法律分析还是医学诊断&#xff0c;长文本的处理能力都显得尤为重要。然而&#xff0c;现有的基于Transformer的模型在处理这类数据时遇到了重大…

硬件电路基础【5.二极管】

二极管 前言一、基本原理1.1 介绍1.2 结构组成1.3 符号1.4 正负极判断 二、特性参数开关电路注意的参数极限特性电气特性特性曲线 三、应用场景稳压二极管原理故障特点连接方式参数最大额定参数电气特性特性曲线 应用典型的串联型稳压电路过压保护稳压二极管的应用与选择 肖特基…

需要用来做3D家具展示的软件哪个网站更专业?

国内外的3D家具展示软件网站并且值得推荐的也就那么几家&#xff1a; 1、Cedreo&#xff0c;Cedreo 是一个在线3D家居设计平台&#xff0c;适合专业的房屋建筑商、改造商和室内设计师。它允许用户创建2D和3D平面图以及室内外效果图&#xff0c;拥有7000多件可定制的3D家具、材…

单元测试的思考与实践

1. 什么是单元测试 通常来说单元测试&#xff0c;是一种自动化测试&#xff0c;同时包含一下特性&#xff1a; 验证很小的一段代码&#xff08;业务意义 或者 代码逻辑 上不可再分割的单元&#xff09;&#xff0c;能够更准确的定位到问题代码的位置 能够快速运行&#xff08;…