본문 바로가기
안드로이드

[안드로이드] Flow를 정말 간단히 먼저 사용해보자.

by keel_im 2021. 8. 1.
반응형

안녕하세요. 어느 덧 블로그 방문자 수 2000 명이 되었습니다.

지식을 짤막하게만이라고 아니면 저의 작은 경험을 공유하는 블로그인데

많은 분들이 읽어주시니 정말 더 잘써야 겠다는 생각이 드네요.


오늘은 Flow 에 대해서 이야기를 해보려고 합니다.

간단한 설명이나 정의는 다른 블로그들도 잘 설명되어 있어서 참고하시면 좋을 것 같습니다.

저는 일단 써보면서 활용하자는 측면으로 Splash Activity 로 설명을 해보겠습니다. 

현재 안드로이드 12 에서 새로운 Splash 화면에 대한 API 도 나와있으니 참고하시면 좋을 것 같습니다.

https://developer.android.com/about/versions/12/features/splash-screen

 

스플래시 화면  |  Android 12 베타  |  Android Developers

Android 12에서는 모든 앱에 새로운 앱 실행 애니메이션을 사용 설정하는 SplashScreen API를 추가합니다. 여기에는 실행 시 앱 내 모션, 앱 아이콘을 보여주는 스플래시 화면, 앱 자체로의 전환이 포함

developer.android.com

저는 원래 Splash 화면을 Coroutine 을 사용해 딜레이를 주어서 사용했습니다. 코드는 아래와 같습니다.

  private fun goNext() {
    scope.launch {
      delay(1500)
      startActivity(Intent(this@SplashActivity, Main2Activity::class.java))
      finish()
    }
  }

정말 가볍게 사용하는 방법인데요.

또한, ViewModel 를 사용하지 않고 액티비티 화면에서 바로 구현한 것이라 상당히 불편합니다. 😁😁

저는 이를 Flow 를 사용해서 분리를 해보았습니다.
사실 LiveData 를 사용해서 구현을 하더라도 그렇게 차이는 없습니다.

저는 위 코드를 아래와 같이 구현을 했습니다. 

SplashActivity.kt

@AndroidEntryPoint
class SplashActivity : AppCompatActivity() {
    private val binding by lazy { ActivitySplashBinding.inflate(layoutInflater) }
    private val viewModel: SplashViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        observeData()
    }

    private fun observeData() {
        lifecycleScope.launchWhenCreated {
            viewModel.loading
                .collect {
                    if (it) {
                        goNext()
                    }
                }
        }
    }

    private fun goNext() {
        startActivity(Intent(this, AuthActivity::class.java))
        finish()
    }
}

SplashViewModel.kt

@HiltViewModel
class SplashViewModel @Inject constructor() : ViewModel() {
    private val _loading = MutableStateFlow(false)
    val loading: StateFlow<Boolean> get() = _loading

    init {
        viewModelScope.launch {
            delay(1_000L)
            _loading.value = true
        }
    }
}

* AndroidEntryPoint 는 Hilt 에서 사용되는 어노테이션 입니다. 

위 코드처럼 사용해서 딜레이를 주는 방식으로 Flow 를 사용을 해봤습니다. 

앞으로는 이 형태를 점점 발전시킬 생각입니다. 라이브 데이터 충분히 좋은 수단이지만, 

그래도 한 번 플로우를 사용해서 점점 발전시킬 생각입니다. 감사합니다.ㅎㅎ

반응형

댓글