목차

Hot Observable의 응용

Connectable Observable

-publish

-refCount

-share

-replay

-autoConnect

과제

예제 만들기

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/761db0bb-16f8-410d-b32d-be27f3339c9d/_2020-10-18__10.06.50.png

위 그림과 같이 만들어보자

xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_connect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="connect"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_dispose"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="dispose"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/btn_connect" />

    <TextView
        android:id="@+id/tv_observable3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="text3 observable"
        app:layout_constraintBottom_toBottomOf="@id/btn_subscribe3"
        app:layout_constraintEnd_toStartOf="@id/btn_subscribe3"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/btn_subscribe3" />

    <Button
        android:id="@+id/btn_subscribe3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="subscribe"
        app:layout_constraintBottom_toTopOf="@id/btn_connect"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/tv_observable3" />

    <TextView
        android:id="@+id/tv_observable2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="text2 observable"
        app:layout_constraintBottom_toBottomOf="@id/btn_subscribe2"
        app:layout_constraintEnd_toStartOf="@id/btn_subscribe2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/btn_subscribe2" />

    <Button
        android:id="@+id/btn_subscribe2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="subscribe"
        app:layout_constraintBottom_toTopOf="@id/btn_subscribe3"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/tv_observable2" />

    <TextView
        android:id="@+id/tv_observable1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="text2 observable"
        app:layout_constraintBottom_toBottomOf="@id/btn_subscribe1"
        app:layout_constraintEnd_toStartOf="@id/btn_subscribe1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/btn_subscribe1" />

    <Button
        android:id="@+id/btn_subscribe1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="subscribe"
        app:layout_constraintBottom_toTopOf="@id/btn_subscribe2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/tv_observable1" />

</androidx.constraintlayout.widget.ConstraintLayout>

Main

private val compositeDisposable = CompositeDisposable()
private val publishObservable = Observable.interval(0, 1, TimeUnit.SECONDS)
    .map { seconds ->
        val minutes = TimeUnit.SECONDS.toMinutes(seconds)
        val seconds = seconds % TimeUnit.MINUTES.toSeconds(1)
        String.format("%02d:%02d", minutes, seconds)
    }

전역변수에 선언하고