okhttp使用,支持断点续传
来源:互联网 发布:云南旅游市场分析数据 编辑:程序博客网 时间:2024/06/01 09:25
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和源码,就这么实现网络请求。
下面提供项目源码和demo供参考最新代码请参考github中项目;不足之处请各位多多指教,留言。。。
demo下载地址github
csdn下载地址
- okhttp使用,支持断点续传
- OkHttp使用+文件的上传+断点续传
- Android 使用OkHttp支持HttpDNS
- 使用OkHttp实现下载的进度监听和断点续传
- 使用okhttp和前台服务实现断点续传功能
- 【Android】- OkHttp实现断点续传
- OkHttp实现断点续传
- OkHttp实现断点续传
- Android Retrofit+Okhttp断点续传
- service+okhttp实现断点续传下载
- 使用Winnet的下载时,支持断点续传功能
- 在IOS中使用ASIHTTPRequest下载(支持断点续传)
- Android 网络学习之使用多线程下载,支持断点续传
- 使用service实现通知栏下载支持断点续传
- proftpd 支持断点续传
- rsync 支持断点续传
- HTTP支持断点续传
- 服务器是否支持断点续传
- IOS IAP APP内支付 Java服务端代码
- 数据结构之字符串ADT
- 支付宝即时到账接口PC和wap移动端的区别
- Java多线程之synchronized和volatile
- HDU 1000 A + B Problem
- okhttp使用,支持断点续传
- 心灵鸡汤之20160429
- 换行符
- novnc的替代品Guacamole
- win10主机如何在校园网的条件下在虚拟机上安装Hadoop并实现远程SSH操控
- Android自动化测试MonkeyRunner(三)------python基本语法
- MongoDB 针对嵌套对象,多层级结构存储,增删改查
- 使用UI-Router设置页面标题
- HDU 1001 Sum Problem