okhttp使用,支持断点续传

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 mFutureMap;
private ExecutorService mExecutor;
private Map 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 getAllDownloadTasks() {
    return mCurrentTaskList;
}

}

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

okhttp使用,支持断点续传_第1张图片
okhttp使用,支持断点续传_第2张图片

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

你可能感兴趣的:(okhttp)