##关于Retrofit
这是一个最近很火的网络请求库,官网在这官网,当然这也是一个开源的项目GitHub地址。可能你对这个不是很熟悉,但是说起他的兄弟,okhttp估计就比较熟悉了,还有大名鼎鼎的依赖注入dagger和图片加载库picasso还有检查内存泄露的LeakCanary都是出自Square公司。当然这只是在JAVA和Android端,在js和Python上也有很棒的项目,有兴趣就自己看了,扯远了。。
为什么要用Retrofit呢,因为他除了提供给我们常见的请求Callback形式,还封装了Observable的请求形式,这就很方便的支持了Rxjava,而Rxjava的强大就是体现在异步任务上。下面来简单的介绍一下使用。
对于RxJava的语法就不说了,有一篇写了关于这方面的,下面就直接开始了。
以github的开放API作为数据来源,我们要去获取某个项目的contributors,以square的retrofit为例,可以调用这个https://api.github.com/repos/square/retrofit/contributors
返回的json是这样的array
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| { login: "JakeWharton", id: 66577, avatar_url: "https://avatars.githubusercontent.com/u/66577?v=3", gravatar_id: "", url: "https://api.github.com/users/JakeWharton", html_url: "https://github.com/JakeWharton", followers_url: "https://api.github.com/users/JakeWharton/followers", following_url: "https://api.github.com/users/JakeWharton/following{/other_user}", gists_url: "https://api.github.com/users/JakeWharton/gists{/gist_id}", starred_url: "https://api.github.com/users/JakeWharton/starred{/owner}{/repo}", subscriptions_url: "https://api.github.com/users/JakeWharton/subscriptions", organizations_url: "https://api.github.com/users/JakeWharton/orgs", repos_url: "https://api.github.com/users/JakeWharton/repos", events_url: "https://api.github.com/users/JakeWharton/events{/privacy}", received_events_url: "https://api.github.com/users/JakeWharton/received_events", type: "User", site_admin: false, contributions: 619 },
|
这里我们只使用到login
和contributions
1.定义一个接口,这个看代码就明白了
1 2 3 4 5
| public interface GithubApi { @GET("/repos/{owner}/{repo}/contributors") Observable<List<Contributor>> contributors(@Path("owner") String owner, @Path("repo") String repo); }
|
通过注解来提供参数,这里注解有很多,还有@Query
,@QueryMap
,@Body
等等,也可以通过@Headers
设置请求头。参数基于base url,其实就是拼接成的。这个返回的是一个Observable
,这样就很方便的去发布一个事件了。
2.设置RestAdapter
和service
,先用Endpoint(API)
并调用buid()方法来创建一个RestAdapter对象。
1 2
| RestAdapter adapter = new RestAdapter.Builder().setEndpoint( "https://api.github.com/").setLogLevel(RestAdapter.LogLevel.FULL).build();
|
然后使用我们的adapter来创建一个服务适配器(service for adapter)。adapter.create(GithubApi.class);
完整的代码
1 2 3 4 5 6
| private GithubApi _createGithubApi() { RestAdapter adapter = new RestAdapter.Builder().setEndpoint( "https://api.github.com/").setLogLevel(RestAdapter.LogLevel.FULL).build(); return adapter.create(GithubApi.class); }
|
3.这就到了Rxjava的地方了,上一步获取到了GithubApi对象,就可以去调用函数了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| _subscriptions.add( _api.contributors(_username.getText().toString(), _repo.getText().toString())//事件源 .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<Contributor>>() {//订阅者 @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(List<Contributor> contributors) { for (Contributor c : contributors) { _adapter.add(format("%s has made %d contributions to %s", c.login, c.contributions, _repo.getText().toString())); } } }));
|
当然这是一个比较简单的处理过程,并没有用到一下通配符,但是基本的流程就是这样的。
到现在发现我们并没有去解析json数据就自动生成了bean类,这是因为Retrofit已经集成了Gson,并且默认使用Gson来进行解析,当然你也可以自己去定义。在创建RestAdapter
的时候使用setConverter(new GsonConverter(gson))
。默认是使用okhttp进行加载的,当然你也可以去配置一些关于OkHttpClient
的数据,然后通过setClient(new OkClient(client))
进行设置进去。
现在Retrofit
的2.0版本已经出了,主要就是 取消了同步和异步,可以取消正在进行中的业务,取消了Gson的依赖等等,具体可以看这里Retrofit 2.0:有史以来最大的改进
这篇参考了GitHub上的项目RxJava-Android-Samples,这里只是拣取了关于Retrofit的部分,有兴趣可以看看其他的。
参考:
http://www.tuicool.com/articles/26jUZjv
http://www.cnblogs.com/angeldevil/p/3757335.html