本篇内容大部分来自网上查阅,做个简单整合。自当记录,鸽了很久。本来很早就想写了的_(:з」∠)_
首先,网络框架一直都是app使用的基础。应用几乎都是要联网的。所以这个目前最火的网络框架确实是一堆人在使用了!
本篇只是做了一个简单的基础使用和记录!
开始使用先引入资源
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
1.retrofit2的基础使用
只需要创建一个Retrofit对象就可以直接用了!
首先是创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
这边加入了Gson工厂和RxJava2工厂 是为了让返回的结果可以直接转成Gson或者RxJava2对象
之后我们就可以使用这个对象访问网址了
这边我创建了一个url保存接口
IHomeService.java
package com.gjn.msdemo.homepage.Interface;
import com.gjn.msdemo.homepage.model.JokeModel;
import com.gjn.msdemo.homepage.model.PicModel;
import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.http.GET;
import retrofit2.http.Path;
import retrofit2.http.Query;
/**
* IHomeService
* Author: gjn.
* Time: 2017/7/10.
*/
public interface IHomeService {
/**
* http://gank.io/api/data/福利/10/1
* @param count 获取数量
* @param page 页数
* @return
*/
@GET("{count}/{page}")
Observable<PicModel> getPicData(@Path("page") int page,
@Path("count") int count);
/**
* http://japi.juhe.cn/joke/content/text.from?key=ae240f7fba620fc370b803566654949e&page=1&pagesize=10
* @param page 页数
* @param pagesize 获取数量
* @return
*/
@GET("text.from?key=ae240f7fba620fc370b803566654949e")
Observable<ResponseBody> getJokeData(@Query("page") int page,
@Query("pagesize") int pagesize);
}
.
以下是两个访问的调用方法
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://gank.io/api/data/福利/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Observable<PicModel> picData = retrofit
.create(IHomeService.class)
.getPicData(1,10)
.subscribeOn(Schedulers.io());
picData.subscribe(new Consumer<PicModel>() {
@Override
public void accept(@NonNull PicModel picModel) throws Exception {
for (PicModel.ResultsBean resultsBean : picModel.getResults()) {
Log.e("picData", resultsBean.getUrl());
}
}
});
Retrofit retrofit2 = new Retrofit.Builder()
.baseUrl("http://japi.juhe.cn/joke/content/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Observable<ResponseBody> jokeData = retrofit2
.create(IHomeService.class)
.getJokeData(1,10)
.subscribeOn(Schedulers.io());
jokeData.subscribe(new Consumer<ResponseBody>() {
@Override
public void accept(@NonNull ResponseBody responseBody) throws Exception {
Log.e("jokeData", responseBody.string());
}
});
打印结果如下
以上就是retrofit2的基础使用了!
2.rxjava2+retrofit2+okhttp3管理使用
我们可以封装一个管理类来控制这一连串的使用
下面是管理类
RORManager.java
package com.gjn.msdemo.util;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* RORManager
* Author: gjn.
* Time: 2017/7/10.
*/
public class RORManager {
private static RORManager rorManager;
private Retrofit mRetrofit;
private String url;
private OkHttpClient mClient;
private RORManager(){
}
public static RORManager getInstance() {
if (rorManager == null){
synchronized (RORManager.class){
if (rorManager == null){
rorManager = new RORManager();
}
}
}
return rorManager;
}
public <T> T create(Class<T> service){
if (service == null){
throw new NullPointerException("service is null");
}
return mRetrofit.create(service);
}
public RORManager setOkHttpClient(OkHttpClient client){
mClient = client;
return this;
}
public RORManager setUrl(String url){
this.url = url;
mRetrofit = createRetrofit();
return this;
}
private Retrofit createRetrofit() {
if (mClient == null) {
mClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.readTimeout(10,TimeUnit.SECONDS)
.build();
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(mClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
return retrofit;
}
}
这边来说明下
1.管理类所以 做成单列模式
2.我们需要每次都设置url 和 服务类 所以我们将这两个值提供出来 可以设置
3.这边也加入了一个可以设置okHttp3的方法,是为了让用户可以修改okHttp3的参数,例如有时候需要https判断等
然后让我们来使用这个工具类吧
还是调用上面url的方法
Observable<PicModel> picData = RORManager.getInstance()
.setUrl("http://gank.io/api/data/福利/")
.create(IHomeService.class)
.getPicData(1,10)
.subscribeOn(Schedulers.io());
picData.subscribe(new Consumer<PicModel>() {
@Override
public void accept(@NonNull PicModel picModel) throws Exception {
for (PicModel.ResultsBean resultsBean : picModel.getResults()) {
Log.e("picData", resultsBean.getUrl());
}
}
});
Observable<ResponseBody> jokeData = RORManager.getInstance()
.setUrl("http://japi.juhe.cn/joke/content/")
.create(IHomeService.class)
.getJokeData(1,10)
.subscribeOn(Schedulers.io());
jokeData.subscribe(new Consumer<ResponseBody>() {
@Override
public void accept(@NonNull ResponseBody responseBody) throws Exception {
Log.e("jokeData", responseBody.string());
}
});
全部代码
PicModel .java
package com.gjn.msdemo.homepage.model;
import java.util.List;
/**
* PicModel
* Author: gjn.
* Time: 2017/7/10.
*/
public class PicModel {
private boolean error;
private List<ResultsBean> results;
public boolean isError() {
return error;
}
public void setError(boolean error) {
this.error = error;
}
public List<ResultsBean> getResults() {
return results;
}
public void setResults(List<ResultsBean> results) {
this.results = results;
}
public static class ResultsBean {
private String _id;
private String createdAt;
private String desc;
private String publishedAt;
private String source;
private String type;
private String url;
private boolean used;
private String who;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getPublishedAt() {
return publishedAt;
}
public void setPublishedAt(String publishedAt) {
this.publishedAt = publishedAt;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public boolean isUsed() {
return used;
}
public void setUsed(boolean used) {
this.used = used;
}
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
}
}