没有合适的资源?快使用搜索试试~ 我知道了~
Android多线程断点续传下载示例详解
1 下载量 58 浏览量
2021-01-20
09:06:01
上传
评论
收藏 260KB PDF 举报
温馨提示
试读
15页
一、概述 在上一篇博文《Android多线程下载示例》中,我们讲解了如何实现Android的多线程下载功能,通过将整个文件分成多个数据块,开启多个线程,让每个线程分别下载一个相应的数据块来实现多线程下载的功能。多线程下载中,可以将下载这个耗时的操作放在子线程中执行,即不阻塞主线程,又符合Android开发的设计规范。 但是当下载的过程当中突然出现手机卡死,或者网络中断,手机电量不足关机的现象,这时,当手机可以正常使用后,如果重新下载文件,似乎不太符合大多数用户的心理期望,那如何实现当手机可以正常联网时,基于上次断网时下载的数据来下载呢?这就是所谓的断点下载了。这篇文章主要是讲解如何实现断点下
资源详情
资源评论
资源推荐
Android多线程断点续传下载示例详解多线程断点续传下载示例详解
一、概述一、概述
在上一篇博文《Android多线程下载示例》中,我们讲解了如何实现Android的多线程下载功能,通过将整个文件分成多个数据
块,开启多个线程,让每个线程分别下载一个相应的数据块来实现多线程下载的功能。多线程下载中,可以将下载这个耗时的
操作放在子线程中执行,即不阻塞主线程,又符合Android开发的设计规范。
但是当下载的过程当中突然出现手机卡死,或者网络中断,手机电量不足关机的现象,这时,当手机可以正常使用后,如果重
新下载文件,似乎不太符合大多数用户的心理期望,那如何实现当手机可以正常联网时,基于上次断网时下载的数据来下载
呢?这就是所谓的断点下载了。这篇文章主要是讲解如何实现断点下载的功能。
本文讲解的Android断点下载是基于上一篇文章《Android多线程下载示例》 ,本示例是在上一示例的基础上通过在下载的过
程中,将下载的信息保存到Andoid系统自带的数据库SQLite中,当手机出现异常情况而断开网络时,由于数据库中记录了上
次下载的数据信息,当手机再次联网时,读取数据库中的信息,从上次断开下载的地方继续下载数据。好,不多说了,进入正
文。
二、服务端准备二、服务端准备
服务端的实现很简单,这里为了使下载的文件大些,我在网络上下载了有道词典来作为要下载的测试资源。将它放置在项目的
WebContent目录下,并将项目发布在Tomcat服务器中,具体如下图所示:
就这样,服务端算是弄好了,怎么样?很简单吧?相信大家都会的!
三、三、Android实现实现
Android实现部分是本文的重点,这里我们从布局开始由浅入深慢慢讲解,这里我们通过Activity来显示程序的界面,以SQLite
数据库来保存下载的信息,通过ContentProvider来操作保存的记录信息,通过Handler和Message机制将子线程中的数据传递
到主线程来更新UI显示。同时通过自定义监听器来实现对UI显示更新的监听操作。
1、布局实现、布局实现
布局基本上和上一博文中的布局一样,没有什么大的变动,界面上自上而下放置一个TextView,用来提示文本框中输入的信
息,一个文本框用来输入网络中下载文件的路径,一个Button按钮,点击下载文件,一个ProgressBar显示下载进度,一个
TextView显示下载的百分比。
具体布局内容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="下载路径" />
<EditText
android:id="@+id/ed_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="http://192.168.0.170:8080/web/youdao.exe"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载"
android:onClick="download"/>
<ProgressBar
android:id="@+id/pb"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"/>
<TextView
android:id="@+id/tv_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="下载:0%"/>
</LinearLayout>
2、自定义、自定义ProgressBarListener监听器接口监听器接口
新建自定义ProgressBarListener监听器接口,这个接口中定义两个方法,void getMax(int length)用来获取下载文件的长
度,void getDownload(int length);用来获取每次下载的长度,这个方法中主要是在多线程中调用,子线程中获取到的数据传递
到这两个接口方法中,然后在这两个接口方法中通过Handler将相应的长度信息传递到主线程,更新界面显示信息。
具体代码实现如下:
package com.example.inter;
/**
* 自定义进度条监听器
* @author liuyazhuang
*
*/
public interface ProgressBarListener {
/**
* 获取文件的长度
* @param length
*/
void getMax(int length);
/**
* 获取每次下载的长度
* @param length
*/
void getDownload(int length);
}
3.定义数据库的相关信息类定义数据库的相关信息类DownloadDBHelper
在这个实例中,我们将数据库的名称定义为download.db,我们需要保存主键id,文件下载后要保存的路径,每个线程的标识id,
每个线程下载的文件数据块大小,所以,在创建的数据表中共有_id, path,threadid,downloadlength,详情见下图
DownloadDBHelper实现的具体代码如下:
package com.example.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 数据库相关类
* @author liuyazhuang
*
*/
public class DownloadDBHelper extends SQLiteOpenHelper {
/**
* 数据库名称
*/
private static final String NAME = "download.db";
/**
* 原有的构造方法
* @param context
* @param name
* @param factory
* @param version
*/
public DownloadDBHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 重载构造方法
* @param context
*/
public DownloadDBHelper(Context context){
super(context, NAME, null, 1);
}
/**
* 创建数据库时调用
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table download(_id integer primary key autoincrement," +
"path text," +
"threadid integer," +
"downloadlength integer)");
}
/**
* 更新数据库时调用
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
4、创建、创建DownloadProvider类类
DownloadProvider类继承自ContentProvider,提供操作数据库的方法,在这个类中,通过UriMatcher类匹配要操作的数据
库,通过DownloadDBHelper对象来得到一个具体数据库实例,来对相应的数据库进行增、删、改、查操作。
具体实现如下代码所示:
package com.example.provider;
import com.example.db.DownloadDBHelper;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
/**
* 自定义ContentProvider实例
* @author liuyazhuang
*
*/
public class DownloadProvider extends ContentProvider {
//实例化UriMatcher对象
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
//配置访问规则
private static final String AUTHORITY = "download";
//自定义常量
private static final int DOWANLOAD = 10;
剩余14页未读,继续阅读
weixin_38522323
- 粉丝: 5
- 资源: 908
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0