RX java / Android我如何实现这个使用debounce运算符的每次点击吐司

时间:2017-08-26 12:57:34

标签: java android kotlin rx-java rx-android

我有这个ImageView,点击它应该显示吐司,也点击图像查看api,所以我决定在Rx中使用Debounce运算符 但现在每次点击都看不到。下面是代码

cartSubscriptionDecrement = RxView.clicks(holder.databinding
            .cartQuantityLayout.ivDecreaseQuantity)
            .debounce(1000, TimeUnit.MILLISECONDS)
            .subscribe { next ->
   cartQuantityEvent.onCartQuantityDecremented(cartSubscriptionDecrement!!)
            }

我需要在每次单击imageView时显示吐司。

我试图为Image View设置一个单独的onclick方法,但是在调试过程中我发现控件永远不会出现onclick方法这是我的另一个onclick方法

如何在每次点击时都实现此吐司,而不是在每次点击时都进行api调用(使用Debounce运算符)。

2 个答案:

答案 0 :(得分:1)

有多种方法可以满足您的要求。我在下面列出了最简单的内容,但需要更多地考虑使用doOnNext的潜在副作用。

The code for this example lives on Github here if you're interested in running the app.刚刚意识到包名称错误,但示例运行正常。

示例中最相关的代码如下。关键是你需要在显示Toast之后而不是之前去除

RxView.clicks(image1)
            .doOnNext(imageClickedEvent -> {
                // Show toast every time onNext is called (this will also log to LogCat)
                showToast();
            })
            .debounce(1000, TimeUnit.MILLISECONDS)
            .subscribe(clickEvent -> {
                makeApiCall();
            });
  

我试图为Image View设置一个单独的onclick方法,但是在调试过程中我发现控件永远不会出现onclick方法这是我的另一个onclick方法

我相信是这种情况,因为RxClicks在ImageView上设置一个侦听器,并且框架设置onClick侦听器之后发生,并且OnClickListener上只有一个View RxView.clicks(imageView) 1}}如果我没记错的话。所以正在发生的是if(deck.Count>=10) { cardP1 = deck.Take(10).Select(x => x.Value.ToString()).ToArray(); } 正在接收点击事件而不是您单独创建的方法。

答案 1 :(得分:0)

你必须申请" .subscribeOn(AndroidSchedulers.mainThread())"到所有RxBinding事件,例如" RxView.clicks()"