首页 » Android » 使用OkHttp进行文件上传(或者进行网络连接),这都看不懂

使用OkHttp进行文件上传(或者进行网络连接),这都看不懂

2015-09-21 19:40:09阅读(3131)

1.导包
在build.gradle中导入
//文件上传OkHttp
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okio:okio:1.5.0'

2.写文件上传的类,FileManager
package com.movee.climbing.manager;

import com.squareup.okhttp.Callback;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
* Created by x-dell on 2015/9/10.
*/
public class FileManager {

private FileCallback fileCallback;
private OkHttpClient client;

//构造函数
public FileManager(FileCallback fileCallback){
this.fileCallback = fileCallback;
}

//回调接口,用来操作上传后的结果
public interface FileCallback{
void onfileComplete(String url,JSONObject jsonObject);//第一个参数是URL,第二个参数是上传成功后服务器返回的结果
void onfileErr(String url);//失败后返回URL,可以自己改
}

//上传的具体方法
public void uploadFile(final String url, final String token, final File file){
RequestBody requestBody = new MultipartBuilder() //建立请求的内容
.type(MultipartBuilder.FORM)//表单形式
.addFormDataPart("token", token)//携带的参数
.addFormDataPart("file", file.getName(), RequestBody.create(null, file))//第一个参数是服务器接收的名称,第二个是上传文件的名字,第三个是上传的文件
.build();
Request request = new Request.Builder()//建立请求
.url(url)//请求的地址
.post(requestBody)//请求的内容(上面建立的requestBody)
.build();
initClient();//创建连接OkHttpClient;
//上传连接并通过Callback来获取返回结果
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {//响应失败执行的操作
fileCallback.onfileErr(url); //通过回调方法onfileErr执行响应失败后的操作
}
@Override
public void onResponse(Response response) throws IOException {//响应成功执行的操作
//看清楚是response.body().string()不是response.body().toString()
try {
fileCallback.onfileComplete(url, new JSONObject(response.body().string()));//通过回调方法onfileComplete执行响应成功后的操作
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}

private void initClient() {
client = new OkHttpClient();
//设置超时
client.setConnectTimeout(10, TimeUnit.SECONDS);
client.setReadTimeout(10, TimeUnit.SECONDS);
client.setWriteTimeout(30, TimeUnit.SECONDS);
}

}

3.使用FileManager类进行文件上传,必须实现FileManager类的FileCallback接口
public class XXXimplementsFileManager.FileCallback{ ......}
privateFileManagerfileManager; //声明变量
fileManager=newFileManager(this);//初始化变量

//使用new Thread方式上传
try {
new Thread(new Runnable() {
@Override
public void run() {
fileManager.uploadFile(loaderManager.USER_PIC, UserDB.getInstance().getuToken(), uploadFile);//upload即要上传的文件
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}

实现fileManager的回调接口的函数:
@Override
public void onfileComplete(String url, JSONObject jsonObject) {
Toast.makeText(getActivity(), "上传成功", Toast.LENGTH_SHORT) .show();
//接下来就可以将服务器返回的json字符串进行解析等操作
}

@Override
public void onfileErr(String url) {
Toast.makeText(getActivity(), "网络连接错误", Toast.LENGTH_SHORT) .show();
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹