RxJava随记

大概在8月份左右,在Lead的指导下,新的项目中开始引入RxAndroid,并和Retrofit,Retrolambda一块使用。RxJava的学习曲线陡峭,不容易掌握,当时也考虑到这一点,但是团队人员少,大家学习能力都很强,所以没有什么问题。随着项目的开发,对RxJava也越来越熟悉,同时也感觉到RxJava的强大。

这段时间也想写一些关于RxJava的Blog,但是由于自己的懒惰,一直搁浅着,现在想把一些零散的Code记录下来,也算是一个学习过程。

有一个这样的需求,App在登录过以后,下次启动在闪屏出现时刷新一下token,但是闪屏显示的时间不能太长(假定不能超过3秒),超时后App需要进入主页,不能block用户。也就是说登录服务不能超过3秒,下面是实现:

登录接口

public interface UserService {

    @GET("/user/login")
    Observable login(@Body LoginRequest request);
}

刷新Token的实现

LoginRequest request = new LoginRequest();
//set user info 
//....

ServiceManager.getService(UserService.class)
        .login(request)
        .compose(applySchedulers())
        .timeout(3, TimeUnit.SENCODES, Schedulers.io())         
        .subscribe(response -> {
            if (SUCCESS == response.getStatusCode()) {
                saveToken(response);
            } 
            gotoMainPage();
        }, error -> {
            if (error instanceof TimeoutException) {
                //to error case
            }
            gotoMainPage();
        });

第一版的实现大概就是这样,测试时发现一个问题:Login的服务速度太快了,半秒时间都不到,闪屏一闪而过,看不清楚就到主页了。所以这里还要限制一下,闪屏至少得显示1秒,如果Login服务完成了,需要等待一下。可以使用zip操作符完成这个需求:

ServiceManager.getService(UserService.class)
        .login(request)
        .compose(applySchedulers())
        .timeout(3, TimeUnit.SENCODES, Schedulers.io())
        .zipWith(Observable.timer(1, TimeUnit.SECONDS, 
                    Schedulers.io()),
                    (response, aLong) -> response)
        .subscribe(response -> {
            if (SUCCESS == response.getStatusCode()) {
                saveToken(response);
            } 
            gotoMainPage();
        }, error -> {
            if (error instanceof TimeoutException) {
                //to error case
            }
            gotoMainPage();
        });

让Login服务和等待1秒的方法同时完成再通知Subscriber。这样闪屏的时间就控制在1-3秒之间了。

如果没有使用RxJava,使用Java的CutDownLatch或者其他Synchronizer可以实现,不过可能麻烦一点,当然我也没有试过。

你可能感兴趣的:(Java,Android)