관리 메뉴

나만을 위한 블로그

[Rxjava] Rxjava를 사용한 구구단 예제 본문

개인 공부/Rxjava

[Rxjava] Rxjava를 사용한 구구단 예제

참깨빵위에참깨빵_ 2021. 5. 8. 21:40
728x90
반응형

Rxjava를 공부하기 위해 예제를 찾다가 입력한 숫자에 1~9를 곱한 결과값들을 텍스트뷰에 출력해주는 구구단 예제를 찾았는데, 아무것도 모르는 상태라 그런지 코드 분석 난이도가 불지옥 모드다.

이 예제를 통해서 Rxjava를 공부해나갈 예정이기 때문에 먼저 티스토리에 기록해둔다.

 

프로젝트 수준 gradle의 allProjects 부분은 아래와 같다.

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://oss.jfrog.org/libs-snapshot" }
    }
}

 

그리고 Rxjava를 사용하기 위해선 의존성 문구들이 필요한데, 아래 문구들을 앱 수준 gradle에 복붙하면 된다.

필요없는 것들이 있을 수 있지만 나중에 따로 찾아서 추가하기 귀찮기 때문에 그냥 써뒀다.

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

// RxJava, RxAndroid
implementation 'io.reactivex.rxjava2:rxjava:2.1.2'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'

// RxLifecycle 2.x
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.1.0'
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.1.0'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'

// Utils
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
implementation 'com.jakewharton.timber:timber:4.4.0'

// Utils - butter-knife
implementation 'com.jakewharton:butterknife:10.0.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'

// UniversdalImageLoader
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

 

XML 파일은 아래와 같다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".GugudanActivity">

    <EditText
        android:id="@+id/ed"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_margin="16dp" />


    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_margin="16dp"
        android:textColor="#000000"
        android:textSize="20sp" />

</LinearLayout>

자바 파일은 아래와 같다.

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;

import butterknife.BindView;
import butterknife.ButterKnife;
import io.reactivex.Observable;
import io.reactivex.subjects.BehaviorSubject;

public class GugudanActivity extends AppCompatActivity
{
    @BindView(R.id.ed)
    EditText editText;

    @BindView(R.id.tv)
    TextView textView;

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

        ButterKnife.bind(this);

        BehaviorSubject<String> subject = BehaviorSubject.createDefault("0");

        editText.addTextChangedListener(new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                //
            }

            @SuppressLint("CheckResult")
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                subject.map(dan -> editText.getText().toString().equals(""))
                        .flatMap(dan -> BehaviorSubject.range(1, 9),
                                (dan, row) -> 0 + "x" + row + " = " + 0 + "\n")
                        .scan((x, y) -> x + y)
                        .doOnNext(data -> Log.d("1번째 doOnNext()", data))
                        .subscribe(text -> textView.setText(text));

                subject.map(dan -> Long.parseLong(editText.getText().toString()))
                        .flatMap(dan -> BehaviorSubject.range(1, 9),
                                (dan, row) -> dan + " x " + row + " = " + (dan * row) + "\n")
                        .scan((x, y) -> x + y)
                        .doOnNext(data -> Log.d("2번째 doOnNext()", data))
                        .subscribe(text -> textView.setText(text), Throwable::getMessage);
            }

            @Override
            public void afterTextChanged(Editable s)
            {

            }
        });
    }
}

 

반응형
Comments