美文网首页Android开发Android知识RxJava
RxJava+Retrofit初体验(一)

RxJava+Retrofit初体验(一)

作者: 阿吹md | 来源:发表于2016-10-18 18:57 被阅读323次

    RxJava火了有好长一段时间了,我想大多数了解的小伙伴都是看这篇文章的: 扔物线的给Android开发者的RxJava详解,Retrofit的话自从它出来就一直是很主流的网络请求框架官网的栗子,是从okhttp进化而来,这几个库的配合也是很常见。现在github上面好多的开源项目用的都是什么Rxjava+Retrofit+MVP这些骚框架,看见都害怕,瞬间感觉自己奥特了。就写了这么一个简单的接触这些的一个栗子github项目。####

    首先配置依赖在build.gradle里面添加:######
       dependencies {
         compile 'com.squareup.okhttp3:okhttp:3.4.1'  //配置retrofit的时候配置基于okhttpclient
         compile 'com.squareup.retrofit2:retrofit:2.1.0
         compile 'io.reactivex:rxandroid:1.2.1'
         compile 'io.reactivex:rxjava:1.1.6'
         compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' //Rx和Retrofit配合使用必须添加此依赖
         compile 'com.squareup.retrofit2:converter-gson:2.1.0' //使用Gson自动解析,在retrofit进行配置
       }
    
    开始写代码 定义请求接口(以retrofit的get请求为例去请求http://gank.io/api/day/history ):######
    public interface GitHubService {
        @GET("api/day/history")
        Observable<DayInfo> getDayInfo();//retrofit允许我们使用Rxjava,因此请求会给我们返回Observable对象
    }
    
    接下来我们要去配置retrofit网络请求了######
    public class RetrofitManager {
        public static OkHttpClient client = null;
        public static Retrofit retrofit = null;
        public static final String BASE_URL = "http://gank.io/";
        public static GitHubService service = null;
    
        public static OkHttpClient getOkHttpClient(){//根据你自己的实际情况去进行配置,这里只是一个简单的配置
            if (client == null){ 
              client = new OkHttpClient().newBuilder()
              //.readTimeout(5000, TimeUnit.MILLISECONDS)
              .build();
             }
            return client;
        }
    
        public static Retrofit getRetrofit(){
    
           if (retrofit == null){
              retrofit = new Retrofit.Builder()
             .addConverterFactory(GsonConverterFactory.create())  //配置使用Gson进行解析,请求成功返回的结果不需要再用gson去解析,写好json bean之后会直接解析成bean,这就是之前依赖gson那个原因
             .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//这也是必须配置的,rx和retrofit使用才会兼容,不然会报错。
             .baseUrl(BASE_URL)
             .client(getOkHttpClient()) //将配置的client添加进来
             .build();
          }
          return retrofit;
       }
    
       public static GitHubService getService(){
    
           if (service == null) {
               service = getRetrofit().create(GitHubService.class); //获取GitHubService 
            }
          return service;
       }
    }
    
    最后我们要通过getService()方法得到GitHubService接口并且去调用网络请求的方法:######

    我们在MainActivity中写了这么一个网络请求的方法:

     private void getDayInfoFromNet() {
    
        mSubscribe = RetrofitManager
                            .getService() //得到GitHubService接口
                            .getDayInfo() //调用getDayInfo方法
                            .subscribeOn(Schedulers.io()) //因为它返回的是一个observer对象我们就可以用Rx来处理了,异步操作放在io线程,内部是线程池实现
                            .observeOn(AndroidSchedulers.mainThread()) //subscribe的回调在主线程
                            .subscribe(new Subscriber<DayInfo>() {
    
                             @Override
                             public void onStart() { //此方法是在订阅之前回调的,我们可以在里面处理一些简单的逻辑
                                   super.onStart();
                                   mProgressBar.setVisibility(View.VISIBLE);
                             }
    
                             @Override
                             public void onCompleted() {
                                   mProgressBar.setVisibility(View.GONE);
                             }
    
                             @Override
                             public void onError(Throwable e) {
                                  mProgressBar.setVisibility(View.GONE);
                             }
    
                             @Override
                             public void onNext(DayInfo dayInfo) { //成功之后我们会得到gson解析的bean
                                   List<String> datas = dayInfo.getResults();
    
                                        if (mAdapter == null) {
    
                                           mAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, datas);
    
                                        }
                               mListView.setAdapter(mAdapter);
                           }
             });
     }
    
    完事儿后我们可以在onDestroty里面取消注册######
    @Override
    protected void onDestroy() {
        if (mSubscribe.isUnsubscribed()){
            mSubscribe.unsubscribe();
        }
    }
    
    效果图######
    simple.png
    当然,我这个demo只是一个简单配合的请求,如果你的项目中遇到更多或者更复杂的你可以对请求进行封装,返回结果进行封装,万变不离其宗只要理解了他们怎么用我想那也不会是难事,希望可以和各位兄弟共同学习!!!######

    相关文章

      网友评论

      本文标题:RxJava+Retrofit初体验(一)

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