Android Retrofit 2,RxJava 2精要实例

本文旨在记录最热门框架的使用及简单实例,起到抛砖引用的目的,若有更复杂需求,还请参考其他资料.

Retrofit 2:
概念:基于OkHtttp封装,基于注解方式,解耦更彻底的HTTP网络请求框架

Retrofit 2+okhttp3使用:
1:添加依赖

    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
    compile 'com.squareup.okhttp3:okhttp:3.3.0'
    compile 'com.squareup.okio:okio:1.7.0'

2:定义接口

public interface IRegisterService {
    @FormUrlEncoded
    @POST("RegisterDataServlet")
    Call<RegisterBean> createUser(@FieldMap Map<String ,String> params);
}

3:初始化Retrofit

mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(mGson))
                .client(mOkHttpClient)
                .build();

4:初始化OkHttpClient

 mOkHttpClient = new OkHttpClient.Builder()
                .connectTimeout(12, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                .addInterceptor(mHttpLogInterceptor)
                .addInterceptor(mBaseParamsInterceptor)
                .addInterceptor(mUrlInterceptor)
                .cache(cache)
                .build();

5:请求使用

IRegisterService loginService = mRetrofit .create(IRegisterService.class);
Map<String,String> mParamsMap = new HashMap<>();
mParamsMap.put("username",userName);
mParamsMap.put("password",password);
Call<RegisterBean> call =  loginService.createUser(mParamsMap);
call.enqueue(new Callback<String>() {
   public void onResponse(Call<RegisterBean> call, Response<RegisterBean> response) {
        if(response.body().getErrorCode()==1){
            Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
            startActivity(intent);
        }else{
            Toast.makeText(getBaseContext(),"注册失败",Toast.LENGTH_SHORT).show();
        }
    }
    public void onFailure(Call<RegisterBean> call, Throwable t) {

    }
    });

RxJava 2:
概念:
一个对于构成使用的Java虚拟机观察序列异步和基于事件的程序库,通俗的话就是异步数据传递和处理,并且链式调用(逻辑清晰),可以用rxbus代替Eventbus

视图:
发送源(Flowable,)—–>接收源(subscriber和consumer)

使用:
1:添加依赖

compile 'io.reactivex.rxjava2:rxjava:2.0.0'
compile 'org.reactivestreams:reactive-streams:1.0.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'

2:Rxjava2和Rxjava1.x差距不小,所以这是Rxjava 2简单实例:

1:map使用---Flowable.subscribe(Consumer)
Flowable.just("map")
        .map(new Function<String, String>() {
            @Override
            public String apply(String s) throws Exception {
                return s + " -aile";
            }
        })
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                System.out.println(s);
            }
        });

2:flatMap使用---Flowable.subscribe(Consumer)
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(1);
list.add(5);
Flowable.just(list)
        .flatMap(new Function<List<Integer>, Publisher<Integer>>() {
            @Override
            public Publisher<Integer> apply(List<Integer> integers) throws Exception {
                return Flowable.fromIterable(integers);
            }
        })
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println(integer);
            }
        });

3:filter使用---Flowable.subscribe(Consumer)
Flowable.fromArray(1, 20, 5, 0, -1, 8)
        .filter(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer.intValue() > 5;
            }
        })
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println(integer);
            }
        });


4:take使用---Flowable.subscribe(Consumer)
Flowable.fromArray(1, 2, 3, 4)
        .take(2)
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println(integer);
            }
        });

5:doOnnext使用---Flowable.subscribe(Consumer)
Flowable.just(1, 2, 3)
        .doOnNext(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println("保存:" + integer);
            }
        })
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println(integer);
            }
        });

6:Flowable.subscribe(Subscriber)
Flowable.create(new FlowableOnSubscribe<String>() {
    @Override
    public void subscribe(FlowableEmitter<String> e) throws Exception {
        e.onNext("exception:" + (1 / 0));
        e.onComplete();
    }
}, BackpressureStrategy.BUFFER)
        .subscribe(new Subscriber<String>() {
            @Override
            public void onSubscribe(Subscription s) {
                s.request(1);
            }

            @Override
            public void onNext(String s) {
                System.out.println(s);
            }

            @Override
            public void onError(Throwable t) {
                t.printStackTrace();
                System.out.println("onError");
            }

            @Override
            public void onComplete() {
                System.out.println("on complete");
            }
        });

7:线程调度(shedule)---Flowable.subscribe(Consumer)
Flowable.create(new FlowableOnSubscribe<String>() {
    @Override
    public void subscribe(FlowableEmitter<String> e) throws Exception {
        e.onNext("将会在3秒后显示");
        SystemClock.sleep(3000);
        e.onNext("ittianyu");
        e.onComplete();
    }
}, BackpressureStrategy.BUFFER)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Toast.makeText(RxJava2Activity.this, s, Toast.LENGTH_SHORT).show();
            }
        });

Retrofit 2+RxJava 2使用:
1:添加依赖

compile 'io.reactivex.rxjava2:rxjava:2.0.0'
compile 'org.reactivestreams:reactive-streams:1.0.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.10.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

2:定义Retrofit接口

public interface BaiDuService {
    @GET("/")
    Flowable<ResponseBody> getText();
}

3:初始化Retrofit

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://www.baidu.com/")
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())// 添加RxJava2的适配器支持
        .build();

4:Rxjava方式,调用发送请求

BaiDuService service = retrofit.create(BaiDuService.class);
service.getText()
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<ResponseBody>() {
            public void onSubscribe(Subscription s) {
                s.request(Long.MAX_VALUE);
            }
            public void onNext(ResponseBody s) {
                Toast.makeText(RxJava2Activity.this, "获取成功", Toast.LENGTH_SHORT).show();
                try {
                    System.out.println(s.string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            public void onError(Throwable t) {
                t.printStackTrace();
                Toast.makeText(RxJava2Activity.this, "获取失败,请检查网络是否畅通", Toast.LENGTH_SHORT).show();
            }
            public void onComplete() {
                System.out.println("任务结束");
            }
        });

好了,这是简单介绍,具体复杂程度看业务

猜你喜欢

转载自blog.csdn.net/ware00/article/details/71535731