一、为什么要用Retrofit+RxJava网络框架
在Android开发中,把网络请求这样的耗时操作放在主线程中执行无疑会导致app崩溃,但是UI操作却只能在主线程中进行操作,所以在Android开发中使用Retrofit+RxJava网络框架能够很好的解决这个问题。
1、Retrofit作用:把Java接口转换成HTTP请求,以RPC形式调用远程服务
2、RxJava作用:通过实现生产者与消费者,使得数据处理流程流水线化;此外,使主线程能观察到异步请求,将响应数据在主线程中展示,减少线程切换的麻烦。
二、使用使用步骤:
步骤一:在gradle中增加依赖
这使用Retrofit2+RxJava2(Android Studio 3中使用api,老版本使用compile)
api 'com.squareup.okhttp3:logging-interceptor:3.4.1' //Okhttp3 日志
//only Retrofit(只用Retrofit联网)
api 'com.squareup.retrofit2:retrofit:2.1.0'
api 'com.squareup.retrofit2:converter-gson:2.1.0' //retrofit gson数据转换器
//Rxjava and Retrofit(Retrofit+Rx需要添加的依赖)
api('com.squareup.retrofit2:adapter-rxjava2:2.3.0'){
exclude group: 'io.reactivex' ,module:'rxjava' //排除默认引用
}
api 'io.reactivex.rxjava2:rxjava:2.1.14'
api 'io.reactivex.rxjava2:rxandroid:2.0.1'
步骤二:创建一个描述网络请求的接口
我这里测试使用JsonObject接收返回数据,也可以创建一个类来接收
我使用了一个根地址,也可以不使用,在请求方法中将地址补全即可
public interface EasyMockService {
String BaseURL = "https://www.easy-mock.com" ;//请求根地址
@Headers({"Content-Type:application/json","Accept:application/json"})//请求头参数设置
@GET("/mock/5b5aebd598d3191437d91474/test")//请求方法设置
public Observable<JsonObject> test();//接收响应方法设置,这里使用RxJava的Observable观察响应,如有请求参数可使用@Body在方法中增加参数
}
步骤三:创建Retrofit
这里加入了日志打印,也可以不设置
private static Retrofit getRetrofit(String baseurl) {
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Platform platform = Platform.get();
platform.log(Platform.INFO, message, null);
}
});//创建日志打印器
if(BuildConfig.DEBUG) {
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
}else{
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
}//设置日志打印级别
OkHttpClient httpClient = new OkHttpClient.Builder()
.addNetworkInterceptor(logInterceptor)//加入网络请求日志打印
.cookieJar(CookieManager.shareInstance())//加入cookie,如果没有cookie可以不要
.build();//创建请求客户端
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//接收response的方式,这里使用了RxJava
.addConverterFactory(GsonConverterFactory.create())//数据解析方式,这里使用Gson
.client(httpClient)//传入请求客户端
.baseUrl(baseurl)//传入连接路径的根路径
.build();//创建retrofit实例
return retrofit;
}
步骤四:创建代理服务
private static EasyMockService getRetrofitService() {
return getRetrofit(EasyMockService.BaseURL).create(EasyMockService.class);//创建代理服务
}
步骤五:创建转换器
public <T> ObservableTransformer composeTransformer() {//创建装换器
return new ObservableTransformer<T, T>() {
@Override
public Observable<T> apply(Observable<T> observable) {
return observable.subscribeOn(Schedulers.io())//被观察者在子线程执行
.observeOn(AndroidSchedulers.mainThread());//在观察者主线程观察
}
};
}
步骤六:注册服务
public class MainActivity extends AppCompatActivity {
Button but;
TextView text;
private EasyMockService mockService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
but=findViewById(R.id.button1);
text=findViewById(R.id.textView);
mockService = getRetrofitService();
loginToEasyMock();
but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getTestData();
}
});
}
public void getTestData (){
mockService.test()
.compose(this.<JsonObject> composeTransformer())
.subscribe(new Observer<JsonObject>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(JsonObject o) {
text.setText("result:"+o.get("result")+";data:"+o.get("data")+";time"+o.get("time"));
}
@Override
public void onError(Throwable e) {
Toast.makeText(MainActivity.this,"",Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
}
});
}
}
步骤七:辅助类
import android.support.v4.util.ArrayMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
public class CookieManager implements CookieJar {
private static CookieManager instance;
public static CookieManager shareInstance(){
if(instance==null){
synchronized (CookieManager.class){
if(instance==null){
instance = new CookieManager();
}
}
}
return instance;
}
public final static Map<String,List<Cookie>> cookieStore = new ArrayMap<>();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
if(!url.url().toString().startsWith(EasyMockService.BaseURL)) return;
cookieStore.put(EasyMockService.BaseURL,cookies);
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
if(!url.url().toString().startsWith(EasyMockService.BaseURL)) return new ArrayList<>();
String urlkey = EasyMockService.BaseURL;
List<Cookie> cookies = loadForRequest(urlkey);
return cookies;
}
private List<Cookie> loadForRequest(String url) {
List<Cookie> cookies = cookieStore.get(url);
if(cookies==null){
cookies = new ArrayList<>();
}
return cookies;
}
public void addUserCookie(Cookie cookie){
List<Cookie> cookieList = loadForRequest(EasyMockService.BaseURL);
cookieList.add(cookie);
cookieStore.put(EasyMockService.BaseURL,cookieList);
}
}
测试结果:
image.png
接口模型:
image.png
网友评论