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下载地址

1 0
原创粉丝点击