小编kya*_*nro的帖子

如何用rx-java替换'if语句'以避免回调地狱?

我试图用rx-java替换我的代码.(这是非常小的代码.)

它完成了它的工作原理.

但我想知道......

  1. 这是一个很好的Rx风格吗?
  2. 如果不好,请说明不好的一点

下面是我的api处理代码.

之前

Random r = new Random();
boolean apiResult = r.nextBoolean(); // it represents api result. ex. {"result": true} or {"result": false}

if (apiResult == true) {
    // do something

    System.out.println("result:" + "success");
} else {
    // do something

    System.out.println("result:" + "failure");
}
Run Code Online (Sandbox Code Playgroud)

Random r = new Random();
Observable<Boolean> apiResultStream = Observable.create(new OnSubscribe<Boolean>() {
    @Override
    public void call(Subscriber<? super Boolean> subscriber) {
        // emit true or false
         subscriber.onNext(r.nextBoolean());
    }
}).cache(1);


// I used filter …
Run Code Online (Sandbox Code Playgroud)

java rx-java

17
推荐指数
1
解决办法
2万
查看次数

如何在Observable.timer创建后更改定时器的间隔?

我想更改从api返回的间隔值.

我已尝试在订阅中重新创建计时器(和订阅).但它不起作用.(因为它需要递归订阅...)

所以我用成员间隔值.有用.但它看起来不像Rx风格.

// default interval. it is member
int mInterval = 10;

int initialDelay = 5;
int period = 1;
Observable.timer(initialDelay, period, TimeUnit.SECONDS)
        .filter(time_sec -> time_sec % mInterval == 0)
        .flatMap(time_sec -> getIntervalSecFromApi())
        .subscribe(new_interval_sec -> {
            // do something
            Log.d("timer_log", "end:do something");

            // I want to recreate timer using new_interval_sec. but I have no idea...
            // so I used member for interval value.
            mInterval = new_interval_sec;
        });
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?


编辑

我将代码更改为Rx样式.

BehaviorSubject<Integer> timerSubject = BehaviorSubject.create(initialDelay);

timerSubject
        .switchMap(interval -> Observable.timer(interval, interval, …
Run Code Online (Sandbox Code Playgroud)

rx-java

11
推荐指数
1
解决办法
3096
查看次数

如何在onError之后保留订阅者(RxJava)

1,我试过了

// used retrofit
public interface ApiService {
    @GET(/get_some_data)
    Observable<SomeData> getSomeData();
}



// clickStream created by onClick event
// No.1
clickStream
    .flatMap(e -> apiService.getSomeData())
    .subscribe(
        success -> Log.d("tag", "success"),
        error -> Log.d("tag", "error"),
        () -> Log.d("tag", "complete"))
Run Code Online (Sandbox Code Playgroud)

如果getSomeData()成功,这很好.我每次点击都可以得到一些数据.

但如果发生错误,取消订阅.(因此错误后点击不起作用)


2,我在下面尝试过.(使用onErrorResumeNext)但未订阅.

(没有调用onError,但调用了onComplete.所以取消订阅)

// No.2
clickStream
    .flatMap(e -> apiService.getSomeData())
    .onErrorResumeNext(throwable -> Observable.empty())  // add this line
    .subscribe(
        success -> Log.d("tag", "success"),
        error -> Log.d("tag", "error"),
        () -> Log.d("tag", "complete"))
Run Code Online (Sandbox Code Playgroud)

3,我在下面试过.(重试)

// No.3
clickStream
    .flatMap(e -> apiService.getSomeData())
    .retry(5)                                            // …
Run Code Online (Sandbox Code Playgroud)

rx-java retrofit

10
推荐指数
1
解决办法
3256
查看次数

如何从命令行运行 android studio 格式化程序?

我想从命令行格式化我的 android 项目。(例如,在提交之前,推送之前或任何时间)

是否可以?

(我尝试过“宏”、“android studio 对话框” 。Intellij 在文件保存时重新格式化, 但我经常忘记......)

android-studio

5
推荐指数
0
解决办法
629
查看次数

如何重新询问Facebook SDK 4.0中拒绝的权限(android)

我查了下面.它非常相似,但我的问题不一样.

如何在Facebook SDK 4.0中重新请求权限

我在这段代码中获得了权限.

LoginManager.getInstance().logInWithReadPermissions(*fragment*, "user_friends");
Run Code Online (Sandbox Code Playgroud)

如果用户拒绝"user_friends"权限,我不能在代码上面重新询问"user_friends"权限.因为下一次身份验证会自动拒绝

我应该采取什么行动来以编程方式获取"user_friends"?

android facebook-sdk-4.0

2
推荐指数
1
解决办法
4397
查看次数