我想实现一种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);
}
答案 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) {}
}