问:一、okhttp使用流程
答:1、添加权限,2创建流程
添加权限
配置Okhttp3非常简单,只需要在Android Studio 的gradle进行如下的配置:
创建流程
1、创建一个OkhttpClient对象
2、创建一个Request对象,通过内部类Builder调用生产Response对象。
3、创建一个Call对象,调用execute(同步)/enqueue(异步)方法。
private void datas() {
//get同步方法
OkHttpClient okc = new OkHttpClient();
Request reqt = new Request.Builder().url("https://github.com/hongyangAndroid").build();
try {
Response response = okc.newCall(reqt).execute();
if (response.isSuccessful()){
Log.i("Text","4444444444444444"+response.body().toString());
Headers responseHeaders = response.headers();
for (int i=0;i<responseHeaders.size();i++){
Log.i("Text","5555555555555555"+responseHeaders.name(i)+"---:"+responseHeaders.value(i));
}
}else {
Log.i("Text","5555555555555555"+response.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void datadata() {
//get异步请求方法
OkHttpClient client = new OkHttpClient();
Request reqest = new Request.Builder().url("https://github.com/hongyangAndroid").build();
Call call = client.newCall(reqest);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("Text","2222222222222222"+e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("Text","3333333333333333333"+response);
}
});
}
二、问:okhttp关于返回值需要注意几点
如果希望返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()
三、问:okhttp和0khttp3的区别需要注意几点
答:
1、setCookieHandler替换为Builder的cookieJar方法
2、cookie的设置方式不同,:okhttp:okhttp调用OkHttpClient的setCookieHandler方法,CookieHandler是Android SDK提供的标注的cookie管理,CookieHandler 的之类CookieManager实现了cookie的具体管理方法,构建CookieManager需要实现CookieStore接口,系统提供了一个默认的实现CookieStoreImpl,只负责把cookie存储在内存中。
okhttp3:中已经没有setCookieHandler方法了,而改成了cookieJar,新增了Builder,用Builder构建okhttp,设置cookie在Builder的cookieJar方法中设置
3、Call和Callback不同
okhttp的callback方法是 void onFailure(Request request, IOException e);void onResponse(Response response) throws IOException; okhttp3 的Callback方法有void onFailure(Call call, IOException e);void onResponse(Call call, Response response) throws IOException;okhttp3对Call做了更简洁的封装,okhttp3 Call是个接口,okhttp的call是个普通class,一定要注意,无论哪个版本,call都不能执行多次,多次执行需要重新创建。
4、MultipartBuilder已被升级成MultipartBody,MultipartBody.Part和MultipartBody.Builder.
5、okhttp3已经没有了FormEncodingBuilder,可以用下面这个类代替它:FormBody.Builder
四、问:retrofit网络框架使用
答:分三步
推荐博客:http://www.jianshu.com/p/308f3c54abdd
一、retrofit使用简介(retrofit底层也是用的Okhttp)
第一步:在retrofit中通过一个接口作为http请求的api接口
public interface BlogService{
@GET("blog/{id}") //这里的{id} 表示是一个变量
Call<ResponseBody> getBlog(@Path("id") int id);/** 这里的id表示的是上面的{id} */
}
第二步:创建一个Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:4567/")
.build();
注: Retrofit2 的baseUlr 必须以 /(斜线) 结束,不然会抛出一个IllegalArgumentException,所以如果你看到别的教程没有以 / 结束,那么多半是直接从Retrofit 1.X 照搬过来的。
第三部:调用api接口
BlogService service = retrofit.create(BlogService.class);
Call<ResponseBody> call = service.getBlog(2);
// 用法和OkHttp的call如出一辙
// 不同的是如果是Android系统回调方法执行在主线程
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(
Call<ResponseBody> call, Response<ResponseBody> response) {
try {
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
- 完整代码
import java.io.IOException;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.http.GET;
import retrofit2.http.Path;
/**
* [Retrofit入门]源码
*/
public class Example01 {
public interface BlogService {
@GET("blog/{id}") //这里的{id} 表示是一个变量
Call<ResponseBody> getBlog(@Path("id") int id);// 这里的id表示的是上面的{id}
}
public static void main(String[] args) throws IOException {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:4567/")
.build();
BlogService service = retrofit.create(BlogService.class);
Call<ResponseBody> call = service.getBlog(2);
// 用法和OkHttp的call如出一辙
// 不同的是如果是Android系统回调方法执行在主线程
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(
Call<ResponseBody> call, Response<ResponseBody> response) {
try {
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
}
}