onBack的Rxjava双击完成活动

时间:2018-09-16 20:31:47

标签: android rx-java2

我想实现一种rxjava方式,可以按两下

因此,我指的是this answer,因为它似乎合理,但不起作用 显示吐司并退出

我观察到的双反的代码实现是:

private static final long EXIT_TIMEOUT = 2000;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
private PublishSubject<Boolean> backButtonClickSource = PublishSubject.create();

@NonNull
private Disposable observeBackButton() {
    return backButtonClickSource
            .debounce(100, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext(__ -> ToastUtils.showShort(R.string.back_more_toast_message))
            .timeInterval(TimeUnit.MILLISECONDS)
            .skip(1)
            .filter(interval -> interval.time() < EXIT_TIMEOUT)
            .subscribe(__ -> model.finishActivity());

}

onBackPressed

   public void onBackPressed() {
    backButtonClickSource.onNext(true);
}

2 个答案:

答案 0 :(得分:2)

OP的问题在于他的onBackPressed()方法是这样的:

@Override
public void onBackPressed() {
   super.onBackPressed();
   backButtonClickSource.onNext(true);
}

因此,诀窍是删除super.onBackPressed(),以便您可以根据需要调整该操作。

我已经创建了一个示例,并且对我有用。我刚刚删除了您的模型内容和您的Toast方法,看起来就是这样:

public class MainActivity extends AppCompatActivity {

    private static final long EXIT_TIMEOUT = 2000;
    private PublishSubject<Boolean> backButtonClickSource = PublishSubject.create();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        observeBackButton();
    }

    @NonNull
    private Disposable observeBackButton() {
        return backButtonClickSource
                .debounce(100, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(__ -> Toast.makeText(this, "Press once again to exit", Toast.LENGTH_SHORT).show())
                .timeInterval(TimeUnit.MILLISECONDS)
                .skip(1)
                .filter(interval -> interval.time() < EXIT_TIMEOUT)
                .subscribe(__ -> MainActivity.this.finish());
    }

    @Override
    public void onBackPressed() {
        backButtonClickSource.onNext(true);
    }
}

答案 1 :(得分:1)

该代码怎么样?

private Disposable backPressedDisposable;
private BehaviorSubject<Long> backPressedSubject = BehaviorSubject.createDefault(0L); // init with 0

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 backPressedDisposable = backPressedSubject
   .buffer(2, 1)
   .map(it -> new Pair<>(it.get(0), it.get(1)))
   .map(pair -> pair.second - pair.first < TimeUnit.SECONDS.toMillis(2)) // 2 second
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(willFinish -> {
     if (willFinish) {
       finish();
     }
     else {
       Toast.makeText(getApplicationContext(), "press once more will exit", Toast.LENGTH_SHORT).show();
     }
   });
}

@Override
public void onBackPressed() {
 backPressedSubject.onNext(System.currentTimeMillis()); // add current time
}

@Override
protected void onDestroy() {
 super.onDestroy();

 try {
   backPressedDisposable.dispose();
 } catch (Exception ignore) {}
}