作者:几米小八_198 | 来源:互联网 | 2023-10-10 08:21
大家刚开始写项目时,大多数会选择比较成熟的第三方请求框架。比如Xutils等,更有心者会选择Volley。我个人感觉这是值得肯定的。这两个框架我都在项目中实践过,各有千
大家刚开始写项目时,大多数会选择比较成熟的第三方请求框架。比如Xutils等,更有心者会选择Volley。我个人感觉这是值得肯定的。这两个框架我都在项目中实践过,各有千秋。在我之前的文章中我已经将他们在网络方面的使用,性能做了比较,大家可以看一下。说实话写的不怎么地 .build();
client.newCall(request).enqueue(new Callback()
{
@Override
public void onResponse(Response arg0)
throws IOException
{
if (arg0.isSuccessful())
{
Log.i("获取网络返回数据操作值", "" + arg0.code());
Log.i("获取网络返回数据", arg0.body().string());
}
}
@Override
public void onFailure(Request arg0, IOException arg1)
{
// TODO Auto-generated method stub
}
});
} 在post传入参数时如下,可以看出来,传入header或者post参数都是传到Request里面,因此最后的调用方式也和GET方式样
POST:(异步)
RequestBody formBody = new FormEncodingBuilder()
.add("platform", "android")
.add("name", "bug")
.add("subject", "XXXXXXXXXXXXXXX")
.build();
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
Response response = client.newCall(request)
.enqueue(new Callback()
{
@Override
public void onResponse(Response arg0)
throws IOException
{
if (arg0.isSuccessful())
{
Log.i("获取网络返回数据操作值", "" + arg0.code());
Log.i("获取网络返回数据", arg0.body().string());
}
}
@Override
public void onFailure(Request arg0, IOException arg1)
{
// TODO Auto-generated method stub
}
});
}
2.okHttP也是支持请求缓存的:
private final OkHttpClient client = new OkHttpClient();
File sdcache = getExternalCacheDir(); //设置缓存文件int cacheSize = 10 * 1024 * 1024; // 10 MiB //设置缓存文件大小
client.setCache(new Cache(sdcache.getAbsoluteFile(), cacheSize)); //将缓存参数与Client绑定
这个我在网上看到一篇好的实践文章,讲的很好,作者很用心的,okhttp缓存详解
3.请求回滚撤销操作。
okhttp在这里操作和Volley还蛮像的。经常会使用到对请求的cancel操作,okhttp的也提供了这方面的接口,call的cancel操作。使用Call.cancel()可以立即停止掉一个正在执行的call。如果一个线程正在写请求或者读响应,将会引发IOException,同时可以通过Request.Builder.tag(Object tag)给请求设置一个标签,并使用OkHttpClient.cancel(Object tag)来取消所有带有这个tag的call。但如果该请求已经在做读写操作的时候,cancel是无法成功的,会抛出IOException异常。
public void canceltest() throws Exception {
Request request = new Request.Builder()
.url("http://httpbin.org/delay/2") // This URL is served with a 2 second delay.
.build();
final long startNanos = System.nanoTime();
final Call call = client.newCall(request);
// Schedule a job to cancel the call in 1 second.
executor.schedule(new Runnable() {
@Override
public void run() {
System.out.printf("%.2f Canceling call.%n", (System.nanoTime() - startNanos) / 1e9f);
call.cancel();
System.out.printf("%.2f Canceled call.%n", (System.nanoTime() - startNanos) / 1e9f);
}
}, 1, TimeUnit.SECONDS);
try {
System.out.printf("%.2f Executing call.%n", (System.nanoTime() - startNanos) / 1e9f);
Response respOnse= call.execute();
System.out.printf("call is cancel:" + call.isCanceled() + "%n");
System.out.printf("%.2f Call was expected to fail, but completed: %s%n",
(System.nanoTime() - startNanos) / 1e9f, response);
} catch (IOException e) {
System.out.printf("%.2f Call failed as expected: %s%n",
(System.nanoTime() - startNanos) / 1e9f, e);
}
}
大家查看打印的信息就可以了,一目了然。
在这里我就将Okhttp的基本使用介绍完了,其实Okhttp是要封装的,最好不要用原生的。在下一篇我会向大家分享okhttp二次封装,其实我也是参考的鸿神的代码。