(240526) Medium Daily Digest

Godomin·2024년 5월 26일

Medium-Daily-Digest

목록 보기
5/24

MutableState or MutableStateFlow: A Perspective On What To Use In Jetpack Compose

https://medium.com/@kerry.bisset/mutablestate-or-mutablestateflow-a-perspective-on-what-to-use-in-jetpack-compose-ccec0af7abbf

간단히 정리하자면...

MutableState

  • UI 레이어에서만 사용될 때 적합하다.
  • UI 업데이트는 메인 스레드에서만 되어야 하기 때문에 백그라운드 작업과 상호작용 시 스레딩 관리를 잘 해야 한다.
  • 읽기 전용 처리가 완전하지 않다(명시적으로 형변환하여 쓰기 가능).

MutableStateFlow

  • data, domain layer 등 다른 레이어에서 함께 사용될 때 적합하다.
  • thread-safe하고 reactive하게 사용 가능하다.
  • 읽기 전용으로 캡슐화가 된다.

How to handle single-event in Jetpack Compose

https://marco-cattaneo.medium.com/how-to-handle-single-event-in-jetpack-compose-f90b6220e8c8

Toast 등 one time event 처리를 위해서 state만을 사용한다면 recomposition 시 원치 않는 동작(toast가 다시 보인다)이 발생하거나 기본값 처리가 애매하다는 문제점이 있다. 결국 아래 방법이 가장 많이 쓰이는 것 같다.

// Event
sealed class Event {
	data class ShowToast(val message: String): Event
}

// ViewModel
private val channel = Channel<Event>()
val channelFlow = channel.receiveAsFlow()

// composable
@Composable
fun <T> ObserveAsEvents(
	flow: Flow<T>,
	key1: Any? = null,
	key2: Any? = null,
	onEvent: (T) -> Unit
) {
	val lifecycleOwner = LocalLifecycleOwner.current
	LaunchedEffect(flow, lifecycleOwner.lifecycle, key1, key2) {
		// 앱이 background라면 foreground로 돌아오면 실행
		lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
			// immediate 없으면 이벤트를 잃을 수 있음
			withContext(Dispatchers.Main.immediate) {
				flow.collect(onEvent)
			}
		}
	}
}

여기서 channel을 사용하는 이유는...

  • Channel: buffer가 있음, 그러나 onDestroy상태에서 이벤트가 오면 유실됨
  • SharedFlow: default로 buffer가 없어서 이벤트 유실 됨, 명시적으로 버퍼 줘야 함(reply)
  • State: navigate back 해도 그대로 남아있기 때문에 추가 처리가 필요

Android Alarm Manager: A Magical Wake-up call

https://medium.com/@nileshg994/android-alarm-manager-a-magical-wake-up-call-a9847f740799

  1. 알람을 받을 BroadcastReceiver 생성 후 manifest 등록
  2. receiver로 intent 생성
  3. Intent를 가지는 PendingIntent 생성
  4. PendingIntent를 가지는 AlarmManager 생성

AlarmManager에는 다양한 set 함수가 있는데, 각각 정확도와 배터리 효율에 따라 선택하면 된다. 특히 Doze 모드를 고려해야 한다.

0개의 댓글