美文网首页
Retrofit+RxJava网络框架学习

Retrofit+RxJava网络框架学习

作者: enjoy_CC | 来源:发表于2018-07-29 21:42 被阅读0次

一、为什么要用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

相关文章

网友评论

      本文标题:Retrofit+RxJava网络框架学习

      本文链接:https://www.haomeiwen.com/subject/xyhtvftx.html