您的位置:首页 > 理论基础 > 计算机网络

OKHttp的使用

2017-06-20 18:27 92 查看
[b]一、概念[/b]

什么是OKHttp

Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient。
尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。
OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题。
使用 OkHttp 无需重写您程序中的网络代码。OkHttp实现了几乎和java.net.HttpURLConnection一样的API。如果你用了 Apache HttpClient,则OkHttp也提供了一个对应的okhttp-apache 模块。

二、特点

OkHttp支持如下的特性:
一般的get请求
一般的post请求
基于Http的文件上传
文件下载
加载图片
支持请求回调,直接返回对象、对象集合
支持session的保持

三、使用

1. 使用Get请求网络数据
如下是接收数据的接口
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case GET:
//获取数据
tv_result.setText((String) msg.obj);
break;
case POST:
//获取数据
tv_result.setText((String) msg.obj);
break;
}
}
};
下面是get请求

private void getDataFromGet() {
new Thread() {
@Override
public void run() {
super.run();

try {
String result = get("http://api.m.mtime.cn/PageSubArea/TrailerList.api");
Log.e("TAG", result);
Message msg = Message.obtain();
msg.what = GET;
msg.obj = result;
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();

}
private String get(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}


2. 使用Post请求网络数据
private void getDataFromPost() {
new Thread() {
@Override
public void run() {
super.run();

try {
String result = post("http://api.m.mtime.cn/PageSubArea/TrailerList.api", "");
Log.e("TAG", result);
Message msg = Message.obtain();
msg.what = POST;
msg.obj = result;
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();

}
private String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}


3. 使用OkHttpUtils来请求文本数据
/**
* 使用okhttp-utils的get请求网络文本数据
*/
public void getDataGetByOkhttpUtils() {
String url = "http://www.zhiyun-tech.com/App/Rider-M/changelog-zh.txt";
// url="http://www.391k.com/api/xapi.ashx/info.json?key=bd_hyrzjjfb4modhj&size=10&page=1";
url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
OkHttpUtils
.get()
.url(url)
.id(100)
.build()
.execute(new MyStringCallback());
}

/**
* 使用okhttp-utils的post请求网络文本数据
*/
public void getDataPostByOkhttpUtils() {
String url = "http://www.zhiyun-tech.com/App/Rider-M/changelog-zh.txt";
// url="http://www.391k.com/api/xapi.ashx/info.json?key=bd_hyrzjjfb4modhj&size=10&page=1";
url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
OkHttpUtils
.post()
.url(url)
.id(100)
.build()
.execute(new MyStringCallback());
}

public class MyStringCallback extends StringCallback {
@Override
public void onBefore(Request request, int id) {
setTitle("loading...");
}

@Override
public void onAfter(int id) {
setTitle("Sample-okHttp");
}

@Override
public void onError(Call call, Exception e, int id) {
e.printStackTrace();
tv_result.setText("onError:" + e.getMessage());
}

@Override
public void onResponse(String response, int id) {
Log.e(TAG, "onResponse:complete");
tv_result.setText("onResponse:" + response);

switch (id) {
case 100:
Toast.makeText(OKHttpActivity.this, "http", Toast.LENGTH_SHORT).show();
break;
case 101:
Toast.makeText(OKHttpActivity.this, "https", Toast.LENGTH_SHORT).show();
break;
}
}

@Override
public void inProgress(float progress, long total, int id) {
Log.e(TAG, "inProgress:" + progress);
mProgressBar.setProgress((int) (100 * progress));
}
}


4. 使用OkHttpUtils下载大文件
/**
* 使用okhttp-utils下载大文件
*/
public void downloadFile()
{
String url = "http://vfx.mtime.cn/Video/2016/07/24/mp4/160724055620533327_480.mp4";
OkHttpUtils//
.get()//
.url(url)//
.build()//
.execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), "okhttp-utils-test.mp4")//
{

@Override
public void onBefore(Request request, int id)
{
}

@Override
public void inProgress(float progress, long total, int id)
{
mProgressBar.setProgress((int) (100 * progress));
Log.e(TAG, "inProgress :" + (int) (100 * progress));
}

@Override
public void onError(Call call, Exception e, int id)
{
Log.e(TAG, "onError :" + e.getMessage());
}

@Override
public void onResponse(File file, int id)
{
Log.e(TAG, "onResponse :" + file.getAbsolutePath());
}
});
}

5. 使用OKHttpUtils上传多个文件
/**
* 使用okhttp-utils上传多个或者单个文件
*/
public void multiFileUpload()
{
String mBaseUrl = "http://192.168.0.165:8080/FileUpload/FileUploadServlet";
File file = new File(Environment.getExternalStorageDirectory(), "afu.png");
File file2 = new File(Environment.getExternalStorageDirectory(), "test.txt");
if (!file.exists()||!file2.exists())
{
Toast.makeText(OKHttpActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();
return;
}
Map<String, String> params = new HashMap<>();
params.put("username", "user");
params.put("password", "123");

String url = mBaseUrl ;
OkHttpUtils.post()//
.addFile("mFile", "server_afu.png", file)//
.addFile("mFile", "server_test.txt", file2)//
.url(url)
.params(params)//
.build()//
.execute(new MyStringCallback());
}

6. 使用OKHttpUtils显示图片

public void getImage()
{
tv_result.setText("");
String url = "http://images.csdn.net/20150817/1.jpg";
OkHttpUtils
.get()//
.url(url)//
.tag(this)//
.build()//
.connTimeOut(20000)
.readTimeOut(20000)
.writeTimeOut(20000)
.execute(new BitmapCallback() {
@Override
public void onError(Call call, Exception e, int id) {
tv_result.setText("onError:" + e.getMessage());
}

@Override
public void onResponse(Bitmap bitmap, int id) {
Log.e("TAG", "onResponse:complete");
iv_icon.setImageBitmap(bitmap);
}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android OKHttpUtils