美文网首页
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