面试题记录第十节——(okhttp、retrofit网络框架)

来源:互联网 发布:java线程对象锁 编辑:程序博客网 时间:2024/06/04 18:33

问:一、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();            }        });    }}
原创粉丝点击