1 先看下基础部分:
android okhttp网络访问是基于 tcp/ip 的
最上层是应用层的封装,有http,https(加密),ftp
下面是socket套接字的封装,就是将ip和端口的封装
在下面就是tcp/udp 在下面 ip协议层了。
2 下面看下常用的http/https请求方式
Volley:四个网络调度线程和一个缓存调度线程 适用范围:非大文件(缓存过大影响内存),非频繁数据(线程池线程数小)
OKHttp:用起来有点麻烦,使用时需要一定的经验,比如我的总结:
1 OkHttpClient是线程池和连接池的最小单位,能复用就复用,不然会产生多个线程池和连接池
2 可以用OkHttpClient对象newbuilder()来实现定制新的client请求,依然能实现共享线程池和连接池。
3 内部是quene的方式执行,但无法返回过来的也是顺序过来,需要及时cancel掉对应的call
对应的回调是 java.net.SocketException: Socket closed
关闭方案:
//添加tag
Request request = new Request.Builder().
url(url).tag("requestKey").build();
//When you want to cancel:
//关闭等待队列里的
for (Call call : mHttpClient.dispatcher().queuedCalls()) {
if (call.request().tag().equals("requestKey"))
call.cancel();
}
//B)关闭执行线程池里执行的call(running队列也包含)
for (Call call : mHttpClient.dispatcher().runningCalls()) {
if (call.request().tag().equals("requestKey"))
call.cancel();
}
3 改进方案思考
1 okhttp里用到的okio 是不是可以用mmap来替代,而它的缓存机制仍保留
2 网路差的时候是不是可以自动改为udp方式
期待我的改进版本的okhttp不,期待,我就把这两项给弄了