现在做的公司项目中,网络连接用的是httpUrlConnection,每次网络访问配置下来非常的麻烦,写了个工具类简化了一些重复的代码,但是用起来还是非常蛋疼。这段时间学习的过程中才从网上了解到retrofit,okhttp,rxjava等框架,并且在2016年非常火。整个项目做下来每个网络访问搭配handler代码量非常繁杂,所以准备开始学习这几个框架,利用RxJava与retrofit取代httpUrlConnection和handler
Retrofit 2 的底层是用的就是okhttp3. okhttp3之前也做过相关的了解,执行下来比较简单,用的是Builder模式,但是处理UI线程的东西还是得使用Handler,不过体验上来说还是强过使用httpUrlConnection.而Retrofit相当于封装了okHttp.并且大量使用注解。而我也从今天开始记录我学习Retrofit的总结体会与心得。
OkHttpClient client = new OkHttpClient(); //初始化OkHttpClient对象
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl("http://192.168.1.197:8080/financeLease/")
.build();
可以看到和okhttp的很像,也是Builder模式并且我们都要先初始化okHttpClient。request改为了retrofit。Url改为baseUrl,后面的地址或者其他相关参数是在接口中注解的形式体现,而且要注意baseUrl的结尾需要是”/ “,不然会报异常。
注解中可以定义是POST还是GET,里面可以添加地址或者地址的参数,如果添加动态地址,则需要在方法参数中path形式标明,如果是参数则用Query,方法返回一般是一个Call对象,Call对象在okHttp中已有使用。Call的类型可以是String或是其他,但一般是ResponseBody,也和okHttp一样。
public interface GitHubAPI {
@POST("sysUser_login.action/{action}")
Call Login(@Path("action") String action,@Query("username") String username,@Query("password") String password);
}
而在实际项目中是不需要用到path,所以Login方法实际为
public interface RzzlService {
@POST("sysUser_login.action")
Call Login(@Query("userName") String username,@Query("passWord") String password);
}
编写完接口中的方法后,我们想调用其中的方法则需要配合Retrofit的create方法。
RzzlService rzzlService = retrofit.create(RzzlService.class);
Call call = rzzlService.Login(username,password);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
try {
Log.i(TAG, "json: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call call, Throwable t) {
Log.i(TAG, "FailureOnResponse: "+t.getMessage());
}
});
首先是定义一个call对象并调用接口中的方法再传入参数,并执行call的enqueue也执行异步的网络访问。同步的可以使用execute方法,异步的会回调Callback并且有分别有成功和失败的回调函数,整个过程和okHttp基本相同,在这里Log出后台的回传给我们的json格式数据。
json: {"msg":"ok","success":true}
这样完成了一个完整的使用retrofit2来做网络访问的过程,可以看到整个过程比较简单方便,搭配RxJava的话就更能体现它的优势了。当然我们实际的开发中会有更多的其他操作,包括采取什么方式解析回传的数据或者设置网络访问时的header参数还有接口中一些其他的常用的注解等等的内容将在后面的retrofit学习心得中再做记录。