Dev/Android

Android - RxAndroid/RxJava 의 combineLatest 예제 1

healthyryu 2017. 2. 20. 19:41

RxJava 의 combineLatest 사용 - EditText 이용 예제



1. Reactivex 사이트 - http://reactivex.io/documentation/operators/combinelatest.html

2. Realm 참고 - https://realm.io/kr/news/rxandroid-3/



RxJava 의 combineLatest 를 사용해서 2개의 EditText 의 값을 받아서 버튼을 누르면 두개의 EditText 에 무엇인가가 들어갔을 경우 Toast 에서 "로그인" 혹은 "실패"를 띄우는 예제입니다.



1. Activity 생성

1
2
3
4
5
6
7
8
9
public class MainActivity extends AppCompatActivity {
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
 
}
cs




2. Xml 에 EditText 를 2개, Button 1개를 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingTop="@dimen/activity_vertical_margin"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  tools:context="com.example.jihoonryu.rxandroidtest.MainActivity">
 
  <EditText
    android:id="@+id/et"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!" />
 
  <EditText
    android:layout_below="@id/et"
    android:id="@+id/et2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!" />
 
  <Button
    android:layout_below="@id/et2"
    android:id="@+id/btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="login"/>
  
</RelativeLayout>
 
cs

 



3. EditText, Button 객체 생성을 합니다.

1
2
3
EditText editText = (EditText) findViewById(R.id.et);
EditText editText2 = (EditText) findViewById(R.id.et2);
Button button = (Button) findViewById(R.id.btn);
cs




4. Button 을 눌렀을 경우 체크를 합니다.

1
2
3
4
5
6
button.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
        
  }
});
cs




5. CombineLatest 사용

combineLatest 는 여러 조건들이 다 모여서 처리해야할 때 사용합니다.

두개 이상의 Observable 이 나올때, combineLatest에 Observable 을 받아서 처리하면 됩니다.

여기서 Observable.just() 을 통해서 아이템을 발행합니다. just() 안의 타입에 의해서 (a,b) -> a or b 의 타입이 정해집니다. 예를 들어서 저는 String 타입이기 때문에 (a,b) 의 각각 a,b 의 타입이 String 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
      Observable.combineLatest(Observable.just(editText.getText().toString())
      , Observable.just(editText2.getText().toString())
      , (a, b) -> !TextUtils.isEmpty(a) && !TextUtils.isEmpty(b))
      .observeOn(AndroidSchedulers.mainThread())
      .subscribeOn(Schedulers.computation()).subscribe(o -> {
    
      if (o) {
        Toast.makeText(context, "로그인", Toast.LENGTH_SHORT).show();
      } else {
        Toast.makeText(context, "실패", Toast.LENGTH_SHORT).show();
      }
    }));    
  }
});
cs




6. 결과 화면

EditText 두개 모두 빈값일 경우


EditText 한개만 빈 값일 경우


EditText 두개 모두 채워질 경우


반응형