OkHttp简单使用(未封装)
2016-10-19 21:22
423 查看
-1-OkHttp和Volley性能对比
(1)OkHttp的优点
-a-支持http请求,https请求 -b-支持文件下载
-c-使用HttpURLConnection,不用担心android版本的变更。(至少目前都是支持的)
-d-支持get,post请求 -e-基于Http的文件上传
-f-加载图片 -g-支持session的保持
(2)OkHttp的缺点
-a-比如callback回来是在子线程里面,不能刷新UI,需要我们手动处理
-b-封装比较麻烦
(3)Volley的优点
-a-非常适合进行数量不大,但通信频繁的网络操作 -b-内部封装了异步线程,可以在回调中操作UI
-c-支持get,post网络请求 -d-图片下载
-e-可直接在主线程调用服务端并处理返回结果 -f-可以取消请求,容易拓展,面向接口编程
(4)Volley的缺点
-a-对大文件下载Volley的表现非常糟糕 -b-只支持http请求
-c-图片加载性能一般 -d-使用的是HttpClient,HttpURLConnection
-2-Http Get请求
(1)首先构造一个OkHttpClient:
OkHttpClient mOkHttpClient = new OkHttpClient();
(2)然后通过Request.Builder构造一个Request对象,参数最起码有个url,其实还可以设置更多参数:如header,method等。
final Request request = new Request.Builder().url(“http://www.baidu.com“).build();
(3)然后通过OkHttpClient的newCall(传入request对象)得到一个Call对象,类似于将请求封装成了任务。
Call call = mOkHttpClient.newCall(request);
(4)最后,我们希望以异步的方式去执行请求,所以调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成后,在CallBack中即可得到结果。
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder().url(“http://www.baidu.com“).build();
//new Call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
{
@Override
public void onFailure(Request request, IOException e)
{
}
@Override
public void onResponse(Response response) throws IOException
{
Log.d(“MainActivity” , response.body().string());
}
});
注意:
-a-onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果想得到inputStream,则调用response.body().byteStream()。
能获得返回的inputStream,说明这里支持大文件下载,有inputStream就可以通过IO的方式写文件。
-b-onResponse执行的线程并不是UI线程,如果想操作控件,还是需要使用handler等。
-2-Http Post携带参数
post请求的时候,参数是包含在请求体中的,所以通过FormEncodingBuilder,添加多个String键值,然后通过FormEncodingBuilder的build()方法构造出RequestBody。
-3-使用OkHttp下载图片
-4-使用OkHttp下载文件
}
(1)OkHttp的优点
-a-支持http请求,https请求 -b-支持文件下载
-c-使用HttpURLConnection,不用担心android版本的变更。(至少目前都是支持的)
-d-支持get,post请求 -e-基于Http的文件上传
-f-加载图片 -g-支持session的保持
(2)OkHttp的缺点
-a-比如callback回来是在子线程里面,不能刷新UI,需要我们手动处理
-b-封装比较麻烦
(3)Volley的优点
-a-非常适合进行数量不大,但通信频繁的网络操作 -b-内部封装了异步线程,可以在回调中操作UI
-c-支持get,post网络请求 -d-图片下载
-e-可直接在主线程调用服务端并处理返回结果 -f-可以取消请求,容易拓展,面向接口编程
(4)Volley的缺点
-a-对大文件下载Volley的表现非常糟糕 -b-只支持http请求
-c-图片加载性能一般 -d-使用的是HttpClient,HttpURLConnection
-2-Http Get请求
(1)首先构造一个OkHttpClient:
OkHttpClient mOkHttpClient = new OkHttpClient();
(2)然后通过Request.Builder构造一个Request对象,参数最起码有个url,其实还可以设置更多参数:如header,method等。
final Request request = new Request.Builder().url(“http://www.baidu.com“).build();
(3)然后通过OkHttpClient的newCall(传入request对象)得到一个Call对象,类似于将请求封装成了任务。
Call call = mOkHttpClient.newCall(request);
(4)最后,我们希望以异步的方式去执行请求,所以调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成后,在CallBack中即可得到结果。
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder().url(“http://www.baidu.com“).build();
//new Call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
{
@Override
public void onFailure(Request request, IOException e)
{
}
@Override
public void onResponse(Response response) throws IOException
{
Log.d(“MainActivity” , response.body().string());
}
});
注意:
-a-onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果想得到inputStream,则调用response.body().byteStream()。
能获得返回的inputStream,说明这里支持大文件下载,有inputStream就可以通过IO的方式写文件。
-b-onResponse执行的线程并不是UI线程,如果想操作控件,还是需要使用handler等。
-2-Http Post携带参数
post请求的时候,参数是包含在请求体中的,所以通过FormEncodingBuilder,添加多个String键值,然后通过FormEncodingBuilder的build()方法构造出RequestBody。
private void okHttpPostRequest() { Log.d("MainActivity" , "ok"); OkHttpClient mOkHttpClient = new OkHttpClient(); FormEncodingBuilder builder = new FormEncodingBuilder(); builder.add("name" , "crazyit.org"); builder.add("pass" , "leegang"); final Request request = new Request.Builder().url("http://192.168.1.100:8080/foo/login.jsp") .post(builder.build()).build(); Call call = mOkHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { e.printStackTrace(); } @Override public void onResponse(Response response) throws IOException { Log.d("MainActivity" , response.body().string()); } }); }
-3-使用OkHttp下载图片
private void okHttpLoadImage() { OkHttpClient okHttpClient = new OkHttpClient(); final Request request = new Request.Builder().url("http://192.168.1.100/montain.jpg").build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException { final byte[] datas = response.body().bytes(); runOnUiThread(new Runnable() { @Override public void run() { image.setImageBitmap(BitmapFactory.decodeByteArray(datas , 0 , datas.length)); } }); } }); }
-4-使用OkHttp下载文件
private void loadImageToFile() { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { try { String sdCardDir = Environment.getExternalStorageDirectory().getCanonicalPath(); raf = new RandomAccessFile(sdCardDir + "/montain.jpg" , "rw"); } catch (IOException e) { e.printStackTrace(); } OkHttpClient okHttpClient = new OkHttpClient(); final Request request = new Request.Builder().url("http://192.168.1.100/montain.jpg").build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException { InputStream in = response.body().byteStream(); byte[] buff = new byte[1024]; int hasRead; while ((hasRead = in.read(buff)) > 0) { raf. 91c5 write(buff , 0 , hasRead); } } }); } }
}
相关文章推荐
- 学习笔记 Tianmao 篇 使用简单封装后的自定义OkHttp 获取json被GSON解析后的数据
- okHttp的简单封装使用
- 简单的封装了一个OKHttp网络请求工具类,直接粘贴进去调用使用,很方便
- Android OkHttp的简单使用和封装详解
- okhttp简单封装+使用
- okhttp的使用以及简单的封装
- OKHttp的基本使用和简单封装
- okhttp简单封装及使用
- Android -- OkHttp的简单使用和封装
- okHttp封装,使用超简单的网络请求实现
- 学习笔记 Tianmao 篇 OkHttp 网络的使用的简单封装 获取Json用GSON来解析
- OkHttp简单的封装及使用
- 一个Linux/Unix下的excel库“xlslib”的使用及其简单封装
- Linux下Socket的简单使用及最简化封装
- 【转】Android通知的使用及简单二次封装
- 使用闭包对setTimeout进行简单封装避免出错
- LOG4CXX编译,使用,简单封装
- 使用C++进行WMI查询的简单封装
- 使用NetBox简单实现ASP封装为EXE教程
- Linux下Socket的简单使用及最简化封装