本文共 8909 字,大约阅读时间需要 29 分钟。
一个项目,访问网络那是必须的。现在开源的网络框架很多。比如最开始的HeepClient,Volley,xUtils,最近很火的okhttp,还有例如retrofit,okGo这些都是很不错 的框架。但是毕竟是别人写的。出了什么问题都不好查找。这里自己封装了一个网络框架,记录一下封装思路。
采用线程池做网络请求的缓冲,可以做到高并发。同时将网络请求和网络处理分开,这样逻辑更清楚。这里的模式参考了Volley。
同时封装了网络断点下载文件的功能,添加了优先级,采用数据库做文件下载记录。做优先级的判定。
由于时间有限,写这个框架花了点时间,现在写这个介绍文档有点着急了。具体的逻辑在源码中都有的,参照了各个大神的代码,有鸿洋的okhttpUtils还有okGo这些写的很好的三方。想要学习,就查看下面git的源码。
使用时导入grandle:compile 'com.singleshu88:OkHttpLemon:+'
OkHttpLemon的初始化。
初始化全局变量,也就是设置响应时间之类的参数。
设置url不论是下载文件,上传,还是get,post都是在这里设置url
使用get请求获取参数,同时设置响应类型。
使用get,默认返回String类型
使用post上传参数,可以多次调用。
使用post上传文件,图片之类。
使用post请求,设置响应类型
执行网络请求,返回String类型
执行网络请求,返回设置类型
这些都是常用的网络请求方式,还单独封装了文件下载。
设置下载文件的优先级,一个枚举类型,分别有low,middle,high
下载文件保存的地址,sdcard/0/wps.apk 包括全名
通过下载地址来暂停下载进度
通过下载地址和保存文件地址来暂停下载进度
通过下载地址来重启一个文件下载
通过下载地址和文件保存地址来准确的重启一个被暂停的文件下载
设置网络链接超时等参数
执行文件下载
/** * Created by ShuWen on 2017/3/11. */public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); OkHttpLemon.init().initOptions(); }}
package com.example.administrator.okhttplemondemo;import android.os.Environment;import android.support.annotation.NonNull;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import com.example.lemonlibrary.db.util.PermissionUtils;import com.example.lemonokhttp.enums.DownloadStatus;import com.example.lemonokhttp.http.OkHttpLemon;import com.example.lemonokhttp.interfaces.IDataListener;import com.example.lemonokhttp.interfaces.IDownloadCallback;public class MainActivity extends AppCompatActivity { public String tabaoUrl = "http://download.apk8.com/soft/2015/%E6%B7%98%E5%AE%9D.apk"; public String wpsUrl = "http://gdown.baidu.com/data/wisegame/8be18d2c0dc8a9c9/WPSOffice_177.apk"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PermissionUtils.getInstance().requestPermission(this); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionUtils.getInstance().onRequestPermissionsResult(requestCode,permissions,grantResults,this); } public void click(View view){ switch (view.getId()){ case R.id.btn1: Log.i("tag00","下载wps:"); OkHttpLemon.init() .url(wpsUrl) .downFilePath(Environment.getExternalStorageDirectory() + "/wps.apk") .executeDown(new IDownloadCallback() { @Override public void onDownTotalLength(long totalLen) { } @Override public void onDownCurrentLenChange(long alreadyDownLen, double downPercent, long speed) { Log.i("tag00","-----已下载 "+ alreadyDownLen/1024/1024+"M 下载长度 "+downPercent*100 +"% "+"下载速度:"+ speed/1000 +"k/s"); } @Override public void onFinish(long alreadyDownLen, long totalLen, String stratTime, String finishTime) { Log.i("tag00","下载成功。" + stratTime + " "+finishTime); } @Override public void onEorror(int errorCode, String ts) { Log.i("tag00","下载异常:"+" errorCode: " + errorCode +" errorMsg " +ts); } @Override public void onDownStatusChange(DownloadStatus downStatus) { Log.i("tag00","状态变更:"+downStatus); } }); break; case R.id.btn2: //默认下载文件地址 sdcard/okLemonDown/downFiles Log.i("tag00","下载game:"); OkHttpLemon.init() .url(tabaoUrl) .executeDown(new IDownloadCallback() { @Override public void onDownTotalLength(long totalLen) { } @Override public void onDownCurrentLenChange(long alreadyDownLen, double downPercent, long speed) { Log.i("tag00","-----已下载 "+ alreadyDownLen/1024/1024+"M 下载长度 "+downPercent*100 +"% "+"下载速度:"+ speed/1000 +"k/s"); } @Override public void onFinish(long alreadyDownLen, long totalLen, String stratTime, String finishTime) { Log.i("tag00","下载成功。"); } @Override public void onEorror(int errorCode, String ts) { Log.i("tag00","下载异常:"+" errorCode: " + errorCode +" errorMsg " +ts); } @Override public void onDownStatusChange(DownloadStatus downStatus) { Log.i("tag00","状态变更:"+downStatus); } }); break; case R.id.btn3: OkHttpLemon.init().pause(wpsUrl); break; case R.id.btn5: OkHttpLemon.init().start(wpsUrl); break; case R.id.btn4: OkHttpLemon.init().pause(tabaoUrl); break; case R.id.btn6: OkHttpLemon.init().start(tabaoUrl); break; case R.id.btn7: OkHttpLemon.init().url("http://v3.wufazhuce.com:8000/api/hp/idlist/0") .get(MainPageBean.class) .execute(new IDataListener() { @Override public void onSuccess(MainPageBean s) { Log.i("tag00",s.getRes()+""); for (String s1:s.getData()) { Log.i("tag00",s1); } } @Override public void onError(int code,String ts) { } }); break; case R.id.btn8: OkHttpLemon.init().url("http://v3.wufazhuce.com:8000/api/praise/add") .postString("itemid","1644") .postString("type","hpcontent") .postString("deviceid","ffffffff-b821-e83f-45c3-423b5c7ea996") .postString("version","3.5.0") .postString("devicetype","android") .postString("platform","android") .executes(new IDataListener () { @Override public void onSuccess(String s) { Log.i("tag00",s); } @Override public void onError(int code, String ts) { Log.i("tag00","code:"+code + "提示:"+ts); } }); break; } }}
package com.example.administrator.okhttplemondemo;import java.util.List;/** * Created by ShuWen on 2016/10/26. */public class MainPageBean { /** * res : 0 * data : ["1509","1505","1506","1504","1497","1503","1498","1502","1501","1500"] */ private int res; private Listdata; public int getRes() { return res; } public void setRes(int res) { this.res = res; } public List getData() { return data; } public void setData(List data) { this.data = data; } @Override public String toString() { return "MainPageBean{" + "res=" + res + ", data=" + data + '}'; }}
这个网络加载框架的文件下载的设计还是可以提供参考的,使用了我之前设计的LemonDao的数据库框架扩展性很强。
具体使用参照: