RxJava - 如何在Android中的4个点击事件中调用订阅者

j2e*_*nue 7 android rx-java rx-android

在android中我有一个像这样定义的文本视图:

<TextView
     android:id="@+id/text1"       
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/hello_world"
     android:textColorHighlight="#000000"
     android:textIsSelectable="true" />
Run Code Online (Sandbox Code Playgroud)

我的目标是在点击4次之后,我想开始一项新活动.我需要用RXJava做到这一点; 这是一项要求.或者rxAndroid,rxBinding等等.

我的活动如下:

public class MainActivity extends Activity implements onClickListener {
    TextView tv;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv=(TextView)findViewById(R.id.text1);
        tv.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.text1){

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:但这只是标准的做法.必须有一种方法可以使用反应式rxJava API.

因此onClicklistener,rxBinding我可以这样做,而不是使用with I read.

RxView.clicks(tv).flatMap(tv -> { 
        // another observable which can throw onError. 
        return Observable.error(null); 
    }).subscribe(object -> { 
        Log.d("CLICK", "textview clicked", start activity);
    }, error -> { 
        Log.d("CLICK", "ERROR");
    });
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式使用命令rxBinding使其仅在4次点击后执行吗?我不打算存储静态变量,或者使用匿名类并将成员变量存储为count.应该有一个可观察的方法.

sky*_*all 5

你可以用这样的东西来实现:

Observable.create((Observable.OnSubscribe<Void>) subscriber -> {
    if (!subscriber.isUnsubscribed()) {
        button.setOnClickListener(v -> subscriber.onNext(null));
    }
}).buffer(1000, TimeUnit.MILLISECONDS)
        .filter(clicks -> clicks.size() == 4)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(clicks -> {
            Log.d("CLICK", "CLICK");
        });
Run Code Online (Sandbox Code Playgroud)
  • buffer() - 收集1s窗口的点击次数
  • filter() - 过滤所有发出的缓冲项,其中缓冲区中的项数不等于4(禁用双击,三击,五次点击)

最难的部分是指定缓冲时间"窗口".一秒钟有时不够,但在其他情况下,用户必须等待几毫秒.


The*_*ing 4

您可以创建一个可观察量,以便在每次单击按钮时发出,然后计算它发出的总次数,并使用过滤器,以便您的订阅者只有在发出四次后才会看到它。

Observable<View> buttonObservable = ViewObservable.clicks(initiateButton, false);
buttonObservable.count()
        .filter(count -> (count >= 4))
        .subscribe(object -> {
            //Your code here
        });
Run Code Online (Sandbox Code Playgroud)