HTTP是现代应用程序网络的方式,有效地使用HTTP可以使加载更快。OkHttp是一个默认有效的HTTP客户机:HTTP/2支持允许向同一主机的所有请求共享一个套接字。连接池减少了请求延迟。响应缓存完全避免了网络的重复请求。如果您的服务有多个IP地址,那么当第一个连接失败时,OkHttp将尝试替换地址。这对于IPv4+IPv6和驻留在冗余数据中心的服务是必需的。OkHttp启动与现代TLS特性(SNI, ALPN)的新连接,如果握手失败,则返回到TLS 1.0。使用OkHttp很容易。它的请求/响应API是用流畅的构建器和不变性来设计的。它支持同步阻塞调用和带回调的异步调用。OkHttp支持Android 2.3和以上。对于Java,最低要求是1.7。此段文字来自:点击打开链接
使用前先添加依赖:
compile 'com.squareup.okhttp3:okhttp:3.8.0' compile 'com.squareup.okio:okio:1.7.0'
根据业务需要添加的各种权限,例如SD卡权限、网络权限等等。
上代码:
public class OkhttpActivity extends AppCompatActivity {
OkHttpClient okClient;
//定义文件类型
MediaType MEDIATYPE = MediaType.parse("xxxxx");
例:json:application/json , xml application/xml , png : image/png , jpg : image/jpeg , gif : imge/gif
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_okhttp);
enqueueGet();
enqueuePost();
upLoadFile();
upDownFile();
upLoadMultipartFile();
initOkhttp();
}
//Okhttp初始设置超时时间和缓存
private void initOkhttp() {
OkHttpClient.Builder build = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(20,TimeUnit.SECONDS)
.readTimeout(20,TimeUnit.SECONDS)
.cache(new Cache(getExternalCacheDir().getAbsoluteFile(),10*1024*1024));
OkHttpClient okHttpClient = build.build();
}
//异步get
private void enqueueGet() {
okClient = new OkHttpClient();
Request.Builder requestB = new Request.Builder().url("http://www.baidu.com");
requestB.method("GET",null);
Request request = requestB.build();
Call call = okClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//请求失败
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功
//判断得到的数据是否是缓存数据
if (null !=response.cacheResponse()){
//是缓存数据
}else {
//不是缓存数据
String str = response.networkResponse().toString();
runOnUiThread(new Runnable() {
@Override
public void run() {
//执行各种UI操作
}
});
}
}
});
//取消请求
call.cancel();
}
//异步post
private void enqueuePost() {
okClient = new OkHttpClient();
RequestBody requestB = new FormBody.Builder()
.add("xx","xxx")//参数
.build();
Request request = new Request.Builder()
.url("XXX")//请求路径
.post(requestB)
.build();
Call call = okClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//请求失败
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功
//判断得到的数据是否是缓存数据
if (null !=response.cacheResponse()){
//是缓存数据
}else {
//不是缓存数据
String str = response.networkResponse().toString();
runOnUiThread(new Runnable() {
@Override
public void run() {
//执行各种UI操作
}
});
}
}
});
//取消请求
call.cancel();
}
//异步上传文件 注:同步可以用execute
private void upLoadFile() {
okClient = new OkHttpClient();
File file = new File("XXX");//文件路径 获取文件
Request request = new Request.Builder()
.url("xxxxxxx")//上传文案件的服务器
.post(RequestBody.create(MEDIATYPE,file))
.build();
Call call = okClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//失败
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//成功
}
});
//取消请求
call.cancel();
}
//异步下载文件
private void upDownFile() {
okClient = new OkHttpClient();
Request request = new Request.Builder()
.url("xxxxxxx")//下载文件的路径
.build();
Call call = okClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//失败
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//成功
try {
InputStream inputStream = response.body().byteStream();
FileOutputStream fileOutputStream = null;
fileOutputStream = new FileOutputStream(new File("xxxx"));//下载到
byte[] buff = new byte[2048];
int len = 0;
while ((len = inputStream.read(buff)) != -1){
fileOutputStream.write(buff,0,len);
}
fileOutputStream.flush();;
}catch (Exception e){
e.printStackTrace();
}
}
});
//取消请求
call.cancel();
}
//同时上传文件和参数时
private void upLoadMultipartFile() {
okClient = new OkHttpClient();
RequestBody requestB = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("XX","XX")
.addFormDataPart("XXX","XXX",RequestBody.create(MEDIATYPE,new File("XXX")))
.build();
Request request = new Request.Builder()
.url("XXXX")
.post(requestB)
.build();
Call call = okClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//失败
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//成功
}
});
//取消请求
call.cancel();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
在此例子中各种的路径、参数都是虚拟数据。
版权声明:本文为博主原创文章,如需转载必须注明转载地址。https://blog.csdn.net/yedekuqi4712/article/details/80224825