OKHttpUtils是对OKHttp的一个封装类,OKHttp有很多功能:如文件上传、下载;文本数据的请求get和提交post;下载图片等
需要导入三个jar包:okhttp-3.4.1.jar、okhttputils-2_6_2.jar、okio-1.9.0.jar,我已经收集出来,下面是下载地址
百度云盘地址:https://pan.baidu.com/s/1O6kBWu0PNGGtWcbwLwWLmg
密码:cugv
回调类:okhttpUtils是获取http服务器连接前后,会调用类里的各种方法
AbsCallback: 所有回调的父类,抽象类 StringCallBack:如果返回值类型是纯文本数据,即可使用该回调 BitmapCallback:如果请求的是图片数据,则可以使用该回调 FileCallBack:如果要做文件下载,则必须使用该回调,内部封装了关于文件下载进度回调的方法 1,CallBackString类的onResponse方法中返回值是String类型。 2,CallBackBitmap类的onResponse方法中返回值是Bitmap类型。 3,CallBackFile类的onResponse方法中返回值是File类型。
回调类有以下方法(可以重写回调类里的方法,实现文件下载前的动画演示,文件下载进度等等设置):
以StringCallback为例子:
class MyStringCallback extends StringCallback {
//与服务器连接错误调用方法
@Override
public void onError(Call call, Exception e, int i) {
Toast.makeText(OkhttpUtilsActivity.this,e.getMessage(),Toast.LENGTH_LONG).show();
}
//连接成功,服务器返回数据方法,s为获得的数据
@Override
public void onResponse(String s, int i) {
//textView.setText("请求返回值:"+s);
}
//返回进度的方法
@Override
public void inProgress(float progress, long total, int id) {
// super.inProgress(progress, total, id);
System.out.println("进度"+100 * progress);
}
//与服务器连接之后调用方法(不管get或post是否成功都会调用该方法)
@Override
public void onAfter(int id) {
//super.onAfter(id);
Toast.makeText(OkhttpUtilsActivity.this,"服务器连接完成",Toast.LENGTH_LONG).show();
}
//与服务器连接之前调用方法
@Override
public void onBefore(Request request, int id) {
//super.onBefore(request, id);
Toast.makeText(OkhttpUtilsActivity.this,"开始连接服务器",Toast.LENGTH_SHORT).show();
}
}
上面是获取OkhttpUtils设置获取http连接前后回调类的方法,下面才是真正使用OKhttpUtils的方法
//get请求文本
public void getHttpText() throws Exception {
OkHttpUtils
.get()
.url("http://www.baidu.com")
.addParams("username", "heyman")
.addParams("password", "123")
.id(20)
.build()
.execute(new MyStringCallback());
}
//post提交文本
public void postHttpText(){
String url = "http://www.baidu.com";
OkHttpUtils
.post()
.url(url)
.id(100)
.build()
.execute(new MyStringCallback());
}
//下载文件
public void downloadFile(){
OkHttpUtils//
.get()//
.url("http://vfx.mtime.cn/Video/2016/07/24/mp4/160724055620533327_480.mp4")//
.build()//
.execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(),"MyMusic.mp4"){
@Override
public void onError(Call call, Exception e, int i) {
}
@Override
public void onResponse(File file, int i) {
}
@Override
public void inProgress(float progress, long total, int id) {
super.inProgress(progress, total, id);
progressBar.setProgress((int) (100 * progress));
}
});
}
上传文件还需要一个已经编写好的Servlet的war文件来做测试,将他放入tomcat服务器的webapps目录下,启动tomcat服务器
在这给出百度云盘链接:https://pan.baidu.com/s/1fzSLh7yMSq5ypoWVsTylSg
云盘链接密码:6v0z
//上传多个或者单个文件
public void uploadFile(){
//192.168.1.104为本机IP地址
//由于端口冲突:http://192.168.1.104:8080为tomcat地址
//http://192.168.1.104为apache地址
String url = "http://192.168.1.104:8080/FileUpload/FileUploadServlet";
File fileOne = new File(Environment.getExternalStorageDirectory(), "tiao.mp4");
File fileTWo = new File(Environment.getExternalStorageDirectory(), "shumei.txt");
if (!fileOne.exists() || !fileTWo.exists()) {
Toast.makeText(OkhttpUtilsActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();
return;
}
Map<String, String> paramsMap= new HashMap<>();
//填写用户名与密码,有的服务器需要
paramsMap.put("username", "name");
paramsMap.put("password", "123");
OkHttpUtils.post()
.addFile("mFile", "server_afu.mp4", fileOne)
.addFile("mFile", "server_test.txt", fileTWo)
.url(url)
.params(paramsMap)
.build()
.execute(new MyStringCallback());
}
//获取图片
public void getPicture()
{
String url = "http://images.csdn.net/20150817/1.jpg";
String url2="http://pics.sc.chinaz.com/files/pic/pic9/201807/bpic7704.jpg";
OkHttpUtils
.get()
.url(url2)
.tag(this)
.build()
.connTimeOut(20000)
.readTimeOut(20000)
.writeTimeOut(20000)
.execute(new BitmapCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(Bitmap bitmap, int id) {
Log.e("TAG", "onResponse:complete");
imageView.setImageBitmap(bitmap);
}
});
}
//使用okhttp-utils上传多个或者单个文件(带参数):
public void multiFileUpload()
{
HashMap<String, String> map = new HashMap<>();
map.put("Action", "AppVersion");
map.put("Version", "ss");
map.put("Type", "1");
String url = "请求接口地址" ;
OkHttpUtils.post()
.url(url)
.params(map)
.build()
.execute(new MyStringCallback());
}
最后要在活动的onDestroy里重写取消与http的连接
public void onPause() {
super.onPause();
//取消网络请求,根据tag取消请求
OkHttpUtils.getInstance().cancelTag(this);
}