OKHttp的使用
来源:互联网 发布:mac玩游戏怎么全屏 编辑:程序博客网 时间:2024/06/08 04:16
一、概念
什么是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); } }); }
阅读全文
1 0
- OkHttp的使用介绍
- OkHttp的简单使用
- OKHttp的简单使用
- android OkHttp的使用
- OkHttp的使用
- OkHttp的使用教程
- OkHttp的使用
- OkHttp的使用
- 高效的使用okhttp
- OkHttp的使用
- okhttp 的使用
- okhttp的第一次使用
- 关于OkHttp的使用
- okhttp的使用
- okhttp框架的使用
- OkHttp的使用
- okhttp的使用
- OKHttp的简单使用
- DataRobot开发
- com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: and
- 使用js中常用的鼠标事件实现一个拖拽的例子
- 【转】调用nvm ls-remote只返回N/A 解决方案
- DispatcherServlet,ContextConfigListener,servletContext,applicationContext
- OKHttp的使用
- 高性能网络调优
- 博客新人
- spring简略实现excel导入
- C# 使用SqlBulkCopy类批量复制大数据
- 微信APP支付开发步骤及要点
- 2017全球运维技术大会 12大技术专场等你来!
- 硬件三人行,运放基础第2讲听课笔记,电路分析基础(一)
- Beego应用开发02