RxJava,Retrofit2 In Android

发表于:2016-05-20 15:36:36      发布在:Android      评论:0 条评论

关于RxJava在项目中的配置和使用


RxJava的好处,简单概括就是它使代码更加简洁高效灵活

了解RxJava: https://github.com/lzyzsd/Awesome-RxJava
第一篇博客给对RxJava感兴趣的人一些入门的指引,以及为什么要使用RxJava。

RxJavaDemo:https://github.com/cn-ljb/rxjava_for_android
这个Demo中示例了RxJava在Android中的应用。

RxJava,RxAndroid,Retrofit,再配合Java8的Lambda表达式,让你的代码看起来像在飞一样。
Retrolambda是一个Java类库,在Java5、6、7 上实现Java8的Lambda表达式的功能。你可以通过Retrolambda让使用Lambda表达式的Java8代码运行在Java7或更低版本上。不过需要Java 8来编译源码。

Android Studio中的配置:

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'me.tatarka:gradle-retrolambda:3.2.5'
    }
}

apply plugin: 'me.tatarka.retrolambda'
android {
    compileOptions {    
        sourceCompatibility JavaVersion.VERSION_1_8    
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
//当前依赖库
dependencies {
compile 'io.reactivex:rxjava:1.1.5'
compile 'io.reactivex:rxandroid:1.2.0'
compile 'com.f2prateek.rx.preferences:rx-preferences:1.0.1'
compile 'com.google.code.gson:gson:2.5'
compile 'com.trello:rxlifecycle:0.6.1'
compile 'com.trello:rxlifecycle-components:0.6.1'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
}

介绍使用RxJava需要的一些相关库,在上面的连接中更加详细:

关于使用RxJava的一些小例子:

// 创建observable
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("Hello RxJava");
        subscriber.onCompleted();
    }
});

// 创建subscriber
Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable e) {

    }
    @Override
    public void onNext(String s) {
        log(s);
    }
};

// 订阅
observable.subscribe(subscriber);

//上面是基本的用法,我们直接把创建和订阅连接起来,完整的代码如下
Observable.just("Hello RxJava").subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
        log(s);
    }
});
//使用Lambda表达式后:
Observable.just("Hello RxJava").subscribe(s -> log(s));
/**
* Android View 事件处理
*/
 ViewObservable.clicks(findViewById(R.id.text), false).subscribe(new Action1<OnClickEvent>() {
     @Override
     public void call(OnClickEvent onClickEvent) {
          doSomething();
     }
 });

使用Lambda表达式后:
ViewObservable.clicks(findViewById(R.id.text), false).subscribe(s -> doSomething());

网络请求方面使用Retrofit2:http://square.github.io/retrofit/

先定义请求接口:
public interface Rservice {

   @GET("query?key=12f173de6a551")    
   Call<WechatBean> getMethod(); 

   @GET("query?key=12f173de6a551")    
   Observable<WechatBean> getMethodOb();

   @POST("user/name")
   <T> Observable<WechatBean> postMethodOb(@Body T t);

//下面这种方法是错误的,不支持
   @GET("{url}")    
   Call<WechatBean> getMethod(@Path("url") String url); 

}

public class Retrofit2Utils { 

  public static final String BASEURL = "http://apicloud.mob.com/wx/article/category/";

  public static void getMethod(Subscriber subscriber){
     Rservice rservice = getRetrofit().create(Rservice.class);  
     rservice.getMethodOb().subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())               
    .unsubscribeOn(Schedulers.io()).subscribe(subscriber);
  }    

  public static <T> void postMethod(T t,Subscriber subscriber){ 
       Rservice rservice = getRetrofit().create(Rservice.class);           
       rservice.postMethodOb(t).subscribeOn(Schedulers.io())    
      .observeOn(AndroidSchedulers.mainThread()) 
      .unsubscribeOn(Schedulers.io()).subscribe(subscriber);    
  }    

  private static Retrofit getRetrofit(){        
    return new Retrofit.Builder().baseUrl(BASEURL)
            .addConverterFactory(GsonConverterFactory.create()) 
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//         .client(genericClient()) //添加统一header                
            .build();    
  }    

public static OkHttpClient genericClient() {        
    OkHttpClient httpClient = new OkHttpClient.Builder()   
             .addInterceptor(new Interceptor() {
               @Override                    
               public Response intercept(Chain chain) throws IOException {                       
                    Request request = chain.request() .newBuilder()
                   .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")                                
                   .addHeader("Accept-Encoding", "gzip, deflate")                                
                   .addHeader("Connection", "keep-alive")                                
                   .addHeader("Accept", "*/*")                                
                   .addHeader("Cookie", "add cookies here")                                
                   .build();                        
                    return chain.proceed(request);                    
                }                
             }).build();        
       return httpClient;    
       }
}

//使用示例:GET请求

Retrofit2Utils.getMethod(new Subscriber<WechatBean>() {    
       @Override    
       public void onCompleted() {}    
       @Override    
       public void onError(Throwable e) {        
          e.printStackTrace();    
       }    
       @Override    
       public void onNext(WechatBean wechatBean) { 
       tv_reuslt.setText("Post Result:\r\n" + wechatBean.getMsg());
       }
});

//POST请求使用@Body传一个对象

我想抽取一个公共方法,不在注解里写url,而是传url,@Path注解只支持单个的字段,不支持如”user/name”带”/“的字段,所以只能每个请求都要写一个方法了。

另附上一个不错的Demo:https://github.com/oxoooo/mr-mantou-android

评论
你好,访客