rxJava 공부

RxJava 공부 1 - just, create, fromArray, interval, range, fromIterable, filter, map

-Android 환경에서 Rxjava와 RxAndroid를 사용하기 위해서 rxJava의 튜토리얼을 따라서 공부합니다.


0. RxJava dependency

implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.4'


1. just와 create


  • Just - 객체 또는 객체 집합을 해당 객체 또는 객체를 방출하는 Observable로 변환합니다.
  • Create observer 메소드를 프로그램 적으로 호출하여 Observable을 처음부터 생성


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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import hbs.com.studyandroidach.R
import io.reactivex.Observable
 
class MainActivity : AppCompatActivity() {
    var count = 0
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //val myObserver = MyObserver(this, lifecycle)
        setContentView(R.layout.activity_main)
        executeJustObservable()
        executeCreateObservable()
    }
    
    //just에 있는 아이템을 출력하고 subscriber를 통해서
    //item을 람다형식으로 리턴받습니다.
    //return subscribe(onNext, onError, onComplete, Functions.emptyConsumer());
    //onNext: 아이템을 하나씩 출력
    //onError: Observable의 에러를 출력
    //onComplete: 성공한 후의 처리
    //subscribe({}, {}, {})의 구조로 onNext, onError, onComplete 를 실행
    private fun executeJustObservable() = Observable.just(1"hello"2"bye").subscribe({ item ->
        Log.d("justItem" + count.toString(), item.toString())
        count++
    }, { errorContent ->
        Log.d("error", errorContent.message)
    }, {
        Log.d("on""Complete")
    })
 
    //create는 위의 next, error, complete를 변수를 통해서 직접 제어 가능
    //해당 로직은 emitter를 통해서 onNext를 임의로 실행시켜줍니다.
    //hello1,hello2, hello3이 출력되고 subscribe의 onComplete는 emitter.onComplete가 주석처리 되어있기 때문에
    //실행되지 않습니다.
    private fun executeCreateObservable() = Observable.create<String> { emitter ->
        emitter.onNext("hello1")
        emitter.onNext("hello2")
        emitter.onNext("hello3")
        //emitter.onComplete()
    }.subscribe({
        Log.d("createItem", it.toString())
    }, {
        Log.d("error", it.message)
    }, {
        Log.d("on""Complete")
    })
}
cs



2. fromArray


  • fromArray - Observable을 통해서 array를 다룰 수 있도록 합니다.
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
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import hbs.com.studyandroidach.R
import io.reactivex.Observable
 
class MainActivity : AppCompatActivity() {
    var count = 0
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //val myObserver = MyObserver(this, lifecycle)
        setContentView(R.layout.activity_main)
 
      
        executeFromArray(arrayOf("hello","hi","two"))
 
    }
 
    private fun executeFromArray(datas: Array<String>= Observable.fromArray(datas).subscribe { datas->
        for(data in datas){
            Log.d("data",data)
        }
    }
}
cs



3. Interval


  • Interval - 특정 시간 간격만큼 간격을 둔 정수 시퀀스를 방출하는 Observable을 생성합니다.


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
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import hbs.com.studyandroidach.R
import io.reactivex.Observable
import java.util.concurrent.TimeUnit
 
class MainActivity : AppCompatActivity() {
    var count = 0
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        executeIntervalObservable()
 
    }
    
    //interval(시작 딜레이, ~n 마다, 단위)
    //TimerTask와 Timer처럼 ~초마다 작업을 실행할 수  
    private fun executeIntervalObservable() = Observable.interval(0,1,TimeUnit.SECONDS).subscribe{
        Log.d("count", count.toString())
        count++
    }
}
cs



4. Range


  • Range - 일련의 정수 범위를 방출하는 Observable을 생성합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import hbs.com.studyandroidach.R
import io.reactivex.Observable
import java.util.concurrent.TimeUnit
 
class MainActivity : AppCompatActivity() {
    var count = 0
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //val myObserver = MyObserver(this, lifecycle)
        setContentView(R.layout.activity_main)
 
        executeRangeObservable()
 
    }
    
    //range를 통해서 0번 인덱스에서 10까지 
    private fun executeRangeObservable() = Observable.range(010).subscribe { index->
        Log.d("index",index.toString())
    }
}
cs



5. fromIterable


  • fromIterable - Observable을 통해서 Iterable 자료형을 다룹니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //val myObserver = MyObserver(this, lifecycle)
        setContentView(R.layout.activity_main)
        executeFromIterable(arrayListOf("hello","hi","two"))
 
    }
    private fun executeFromIterable(datas:Iterable<String>= Observable.fromIterable(datas).subscribe{data->
        Log.d("myData",data)
    }
}
cs



6. Filter & Map

  • Filter - 검사를 통과 한 Observable의 항목 만 내 보냅니다.
  • Map - 각 항목에 함수를 적용하여 Observable이 방출하는 항목을 변환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MainActivity : AppCompatActivity() {
    var count = 0
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //val myObserver = MyObserver(this, lifecycle)
        setContentView(R.layout.activity_main)
        executeAdvancedFromIterable(arrayListOf("hello","hi","twp","happy","hit"))
 
    }
 
    //filter를 통해서 it이 twp인 것을 검색함
    //map을 통해서 data를 
    private fun executeAdvancedFromIterable(datas: Iterable<String>= 
Observable.fromIterable(datas)
.filter { it-> it == "twp" }.map{ data->"search:$data"}.subscribe { searchData ->
        Log.d("result",searchData)
    }
    
}
 
cs