okhttp使用,支持断点续传

时间:2021-12-29 23:59:02

Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。
但是部分api使用仍然需要我们自行封装才能适应自己的需要,今天对OkHttp做的一些封装。
封装okhttp 实现一下功能:
1.实现get,post请求
2.支持上传,下载功能
3.支持Gson泛型解析json数据
4.使用mvc设计模式
5.支持自定义exception
6.支持自定义controller
7.封装glide图片库使用
8.支持断点续传功能
基本满足日程开发使用

使用方法:android studio中在app的build.gradle中添加依赖
compile project(‘:library’)
具体参考demo

使用介绍:

1.首先需要在项目的application中如下配置:
Cache cache = new Cache(getCacheDir(), 10 * 1024 * 1024);// 配置缓存大小
// 程序初始化时,初始okhttp配置 ,可自行定义
OKHttpConfig OKHttpConfig = new OKHttpConfig.Builder().setBaseResponseClass(BaseResponse.class)
.setConnectTimeout(10).setReadTimeout(10).setWriteTimeout(10).setCache(cache).build();
// 初始化
OKHttpManager.init(this, OKHttpConfig);
2.继承自library重的controller实现自定义加载器:
3.集成greendao实现断点续传功能

public abstract class MyAppController<Listener> extends OKHttpController<Listener> {


public MyAppController() {
super();
}

public MyAppController(Listener l) {
super();
setListener(l);
}

protected abstract class AppBaseTask<Input, Output> extends LoadTask<Input, Output> {

@Override
public boolean onInterceptor(OKBaseResponse response) {
if (response instanceof BaseResponse) {
BaseResponse resp = (BaseResponse) response;
if (!"10000001".equals(resp.getStatus())) {//101表示成功
// 主线程中调用onError,不能直接调用onError
sendMessage(resp.getMessage(), ERROR_CODE);
return true;
}
}
return false;
}
}
}

此类是抽象类,具体的子功能可对其继承实现;
下面提供一个实现demo,具体作用demo中有注释:

public class LoadController extends MyAppController<LoadController.LoadListener> {

public LoadController(LoadListener l) {
mListener = l;
}

public void load(LoadRequest request) {
Task task = new Task();
task.load(request, LoadResponse.class);
}

/**
* 执行加载任务的task,其回调都是在主线程中调用
* 需要加入请求参数LoadRequest和相应参数LoadResponse
*/

public class Task extends AppBaseTask<LoadRequest, LoadResponse> {

@Override
public IUrl getUrl() {
// 后去url
return URLConst.Product.PRODUCTLIST;
}

@Override
public void onSuccess(LoadResponse loadResponse) {
// 获得加载成功的相应数据,自动解析成LoadResponse
mListener.onLoadSuccess(loadResponse);
}

@Override
public void onError(OkException e) {
// 加载失败回调
mListener.onLoadFail(e);
}
}

/**
* 加载回调接口
*/

public interface LoadListener {

void onLoadSuccess(LoadResponse loadResponse);

void onLoadFail(OkException e);
}
}

以下是断点下载的管理器代码:(参考自)

public class DownloadManager {
private static Context mContext;

private DownloadDao mDownloadDao;
private OkHttpClient mClient;

private int mPoolSize = 5;
// 将执行结果保存在future变量中
private Map<String, Future> mFutureMap;
private ExecutorService mExecutor;
private Map<String, DownloadTask> mCurrentTaskList;

static DownloadManager manager;

/**
* 方法加锁,防止多线程操作时出现多个实例
*/
private static synchronized void init() {
if (manager == null) {
manager = new DownloadManager();
}
}

/**
* 获得当前对象实例
*
* @return 当前实例对象
*/
public final static DownloadManager getInstance() {
if (manager == null) {
init();
}
return manager;
}

public static void init(Context context) {
mContext = context;
getInstance();
}

public DownloadManager() {
initOkhttpClient();

// 数据库初始化
DaoMaster.OpenHelper openHelper = new DaoMaster.DevOpenHelper(mContext, "downloadDB", null);
DaoMaster daoMaster = new DaoMaster(openHelper.getWritableDatabase());
mDownloadDao = daoMaster.newSession().getDownloadDao();

// 初始化线程池
mExecutor = Executors.newFixedThreadPool(mPoolSize);
mFutureMap = new HashMap<>();
mCurrentTaskList = new HashMap<>();
}

/**
* 初始化okhttp
*/
private void initOkhttpClient() {
OkHttpClient.Builder okBuilder = new OkHttpClient.Builder();
okBuilder.connectTimeout(10, TimeUnit.SECONDS);
okBuilder.readTimeout(10, TimeUnit.SECONDS);
okBuilder.writeTimeout(10, TimeUnit.SECONDS);
mClient = okBuilder.build();
}

/**
* 添加下载任务
*
* @param downloadTask
*/
public void addDownloadTask(DownloadTask downloadTask) {
if (downloadTask != null) {
downloadTask.setDownloadDao(mDownloadDao);
downloadTask.setClient(mClient);
downloadTask.setDownloadStatus(DownloadStatus.DOWNLOAD_STATUS_INIT);
// 保存下载task列表
mCurrentTaskList.put(downloadTask.getId(), downloadTask);
Future future = mExecutor.submit(downloadTask);
mFutureMap.put(downloadTask.getId(), future);
}
}

/**
* 暂停下载任务
*
* @param id 任务id
*/
public void pause(String id) {
DownloadTask task = mCurrentTaskList.get(id);
if (task != null) {
task.setDownloadStatus(DownloadStatus.DOWNLOAD_STATUS_PAUSE);
}
}

/**
* 重新开始已经暂停的下载任务
*
* @param id 任务id
*/
public void resume(String id) {
DownloadTask task = mCurrentTaskList.get(id);
if (task != null) {
addDownloadTask(task);
}
}

/**
* 取消下载任务(同时会删除已经下载的文件,和清空数据库缓存)
*
* @param id 任务id
*/
public void cancel(String id) {
DownloadTask task = mCurrentTaskList.get(id);
if (task != null) {
mCurrentTaskList.remove(id);
mFutureMap.remove(id);
task.cancel();
task.setDownloadStatus(DownloadStatus.DOWNLOAD_STATUS_CANCEL);
}
}

/**
* 实时更新manager中的task信息
*
* @param task
*/
public void updateDownloadTask(DownloadTask task) {
if (task != null) {
DownloadTask currTask = mCurrentTaskList.get(task.getId());
if (currTask != null) {
mCurrentTaskList.put(task.getId(), task);
}
}
}

/**
* 获得指定的task
*
* @param id task id
* @return
*/
public DownloadTask getDownloadTask(String id) {
DownloadTask currTask = mCurrentTaskList.get(id);
return currTask;
}

/**
* 获得所有的task
*
* @return
*/
public Map<String, DownloadTask> getAllDownloadTasks() {
return mCurrentTaskList;
}

}

之后就可在Activity或fragment中进行实例调用了,更多功能请参考demo和源码,就这么实现网络请求。

okhttp使用,支持断点续传
okhttp使用,支持断点续传

下面提供项目源码和demo供参考最新代码请参考github中项目;不足之处请各位多多指教,留言。。。
demo下载地址github
csdn下载地址