Rxjava는 다양한 스케줄러를 제공합니다. 특정 스케줄러를 사용하다가 다른 스케줄러로 변경하기 쉽습니다. 마치 map 함수를 한 번 더 호출하는 것처럼 새롭게 스케줄러를 추가하거나 기존의 스케줄러를 다른 것으로 교체할 수 있습니다. 뉴 스레드 스케줄러 이름 그대로 새로운 스케줄러를 생성합니다. Rxjava의 스케줄러는 subscribeOn과 observeOn에 나눠서 적용할 수 있는데, 아래는 subscribeOn만 적용한 코드입니다. 입력 import common.CommonUtils import common.Log import io.reactivex.Observable import io.reactivex.schedulers.Schedulers class NewThreadSchedulerExample..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/uiUJj/btqFS1x7phW/QX7uDS3xY6fwkq6y6Ygwck/img.png)
플러터의 가장 기본적인 버튼입니다. RaisedButton 뿐만 아니라 FlatButton, DropdownButton, FloatingActionButton 등의 다양한 위젯들이 있습니다. RaisedButton의 생성자는 아래와 같습니다. const RaisedButton({ Key key, @required VoidCallback onPressed, VoidCallback onLongPress, ValueChanged onHighlightChanged, ButtonTextTheme textTheme, Color textColor, Color disabledTextColor, Color color, Color disabledColor, Color focusColor, Color hoverColor, ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/SP5dx/btqFOYCt0FI/ORrKLBkDLg3NK5PYKriOik/img.png)
입력 import common.Log import io.reactivex.Observable class HelloRxJava2V2 { fun emit() { Observable.just("Hello", "RxJava2!!") .subscribe { data -> Log.it(data) } } } fun main() { val demo = HelloRxJava2V2() demo.emit() } 출력 main | value = Hello main | value = RxJava2!! 위에는 just를 사용한 간단한 예제입니다. 지금까지 배운 예제의 공통점은 대부분의 동작이 메인 스레드에서 이루어진다는 것입니다. 요구 사항에 맞게 비동기로 동작할 수 있도록 바꿔야 될 때가 있는데, 이때 스케줄러를 사용한다. 스..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bsyWVL/btqFOhgKY08/5URvBQ33vR4IENHi8kPKek/img.png)
delay timer, interval, defer처럼 delay도 시간을 다루는 함수입니다. timer, interval, defer가 Observable을 생성하는 역할이라면, delay는 연산자로서 보조 역할을 합니다. 입력 import common.CommonUtils import common.Log import io.reactivex.Observable import java.util.concurrent.TimeUnit class DelayExample { fun marbleDiagram() { val data = arrayOf("1", "7", "2", "3", "4") val source = Observable.fromArray(*data) .delay(100, TimeUnit.MILLISEC..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bJndow/btqFNPkMrVa/j0KAGHmKfBYsDrvl4OY321/img.png)
조건 연산자 Observable의 흐름을 제어하는 역할을 합니다. filter 연산자가 발행된 값을 채택하느냐 기각하느냐 여부에 초점을 맞춘다면, 조건 연산자는 지금까지의 흐름을 어떻게 제어할 것 인지에 초점을 맞춥니다. amb amb는 ambigious (모호한)라는 영어 단어의 줄임 말입니다. 여러 개의 Observable 중에서 1 개의 Observable을 선택하는데, 선택 기준은 가장 먼저 데이터를 발행하는 Observable입니다. 나머지 Observable에서 발행하는 데이터는 모두 무시합니다. 첫 번째 Observable인 원을 발행했으므로 사각형을 발행하는 두 번째 Observable에서 발행되는 값은 모두 무시합니다. 입력 import common.CommonUtils import co..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/vZc8y/btqFNsDd0Fh/fSkHfeZIsTjZcAydxVUUk1/img.png)
Text Text는 아래와 같은 생성자로 이루어져 있습니다. const Text( this.data, { Key key, this.style, this.strutStyle, this.textAlign, this.textDirection, this.locale, this.softWrap, this.overflow, this.textScaleFactor, this.maxLines, this.semanticsLabel, this.textWidthBasis, }) 아래는 전체 예제 코드입니다. import 'package:flutter/material.dart'; void main() => runApp(TextDemo()); class TextDemo extends StatelessWidget { static ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cgjvx0/btqFLhuPr44/O0Tn2U5plfFnPPAbTPqEWK/img.png)
결합 연산자 생성 연산자와 변환 연산자는 1 개의 데이터 흐름을 다뤘습니다. 결합 연산자는 여러 개의 Observable을 조합하여 활용합니다. zip zip 함수의 특징은 각각의 Observable을 모두 활용해 2 개 혹은 그 이상의 Observable을 결합할 수 있다는 것입니다. 예를 들어 A, B 두 개의 Observable을 결합한다면 2 개의 Observable에서 모두 데이터를 발행할 때까지 발행을 기다립니다. 입력 import common.Log import common.Shape import io.reactivex.Observable import io.reactivex.functions.BiFunction class ZipExample { fun marbleDiagram() { val ..