Android에서 flow를 통한 실시간 데이터 갱신에 대한 정리

작성한 GitHubUserSearch 소스를 기반으로 flow를 통해 실시간 데이터 갱신하는 방법에 대해 정리해 본다.

이 방식을 사용하면 데이터를 다시 부르기 위한 형태가 필요치 않고, 실시간 데이터를 지속적으로 받을 수 있는 장점이 생긴다.

여기에서 설명하는 코드는 매뉴얼 인젝션을 사용한 코드이다.


이 글에서 알아볼 내용

  • coroutines + flow를 통한 실시간 데이터 갱신

Read More

Kotlin flow의 예외 처리(catch), 재시도(retry, retryWhen) 살펴보기

kotlin coroutines을 활용한 exception은 매우 쉽다.

fun some() {
  viewModelScope.launch {
    try {
      // call suspend function
    } catch(e: Exception) {}
  }
}

launch 안에 try/catch 묶어야 함이 중요하다. coroutines의 장점 역시 우리가 항상 사용하는 함수만 이해하면 코루틴을 활용할 수 있다는 점이다.

그렇다면 Flow에서의 예외 처리는 어떻게 할 수 있을까?

가장 기본적으론 아래와 같이 할 수 있다.

fun some() {
  viewModelScope.launch {
    try {
      flowXXX
        .collect {}
    } catch(e: Exception) {}
  }
}

flow 같진 않지만 flow로 동작하니 일단 넘어가자.


이 글에서 알아볼 내용

  • flow를 활용한 exception 처리
  • catch 활용
  • retry, retryWhen 활용

Read More

이력서를 위한 이력 관리는 어떻게 하는 것이 좋을까?

포트폴리오와 이력서는 어떻게 관리하는 것이 좋을까?

그냥 많은 프로젝트를 진행하고, 많은 활동을 하는 것이 좋을까?

이 글은 지극히 개인적인 생각을 담아 정리하기에 편하게 읽어주시길


이 글에서 알아볼 내용

  • 지극히 개인적인 내용을 담았습니다.

Read More

안드로이드 MVVM 따라 하기 - MVVM에서의 안티 패턴

Android MVVM 따라 하기 3 번째 글이다.

이번 글에서는 최소한 하지 않아야 할 부분을 적어보려고 한다.

안드로이드 MVVM은 결국 Lifecycle을 알고는 있다. 하지만 Context를 직접 접근하지는 않아야 한다.

class SampleViewModel {

  fun showMain(context: Context) {
    // Bad
  }

단순 데이터 전달이 없다면 어떠한 이벤트를 바로 View에서 처리하는 편이 더 좋다.

하지만 데이터가 추가로 필요한 경우, 상황에 따라 다른 화면으로 이동을 필요로 한다면 다음과 같이 작성하는 게 좋다.

  private val _showMain = MutableLiveData<Item?>(null)
  val showMain: LiveData<Item?>() get() = _showMain
  // or
  private val _showMain = MutableStateFlow<Item?>(null)
  val showMain: Flow<Item> get() = _showMain.filterNotNull()

  fun loadData() {
    // Load data
    _showMain.value = Item(...)
  }
}


이 글에서 알아볼 내용

  • ViewModel에서 할 수 있는 것과 하지 말아야 할 것은?
  • Context를 넘겨주면 안 되는 이유는?

Read More

안드로이드 Compose Scaffold, TopAppBar 활용한 개발

Android Compose에서는 어떠한 컴포넌트를 최상위로 두고 작업하는 것이 좋을까?

필자의 경우 Compose 시작점 코드는 아래와 같다.

class SampleActivity {

  fun onCreate() {
    setContent { // Compose 활용 시작
      SampleTheme { // 기본 Theme 정의
        CompositionLocalProvider(options) { // 내부에서 활용할 CompositionLocal 이 있다면 등록
          Scaffold { // 머트리얼을 따르는 기본 틀
            // 여기에서 View 처리
          }
        }
      }
    }
  }
}

Theme를 기본으로 적용하고, 여기에 CompositionLocalProvider를 필요에 따라 추가로 활용하고 있다.

그런 다음 Scaffold를 활용해 Material을 따르는 기본 틀을 활용하고 있다.


이 글에서 알아볼 내용

  • Material의 구조를 가볍게 살펴보자
  • Material의 Scaffold를 알아본다
  • TopAppBar를 알아본다.

Read More