1. viewModelScope
mvvm 패턴을 적용하여 앱을 만들때 뷰모델에서 사용했었던 코루틴이다
ViewModelScope는 앱의 뷰모델의 생명주기를 따른다 뷰모델이 삭제되면 자동으로 실행이 중지된다
뷰모델이 소멸 될때는 override fun onCleared()가 호출되는데 이 시점에 뷰모델스코프는 취소된다
하지만 별도로 취소를 명시할필요는없다
1) 취소시점
class ExViewModel : ViewModel() {
init {
viewModelScope.launch {
repeat(10) { i ->
delay(1000L) // 1초 대기
Log.d("MyViewModel", "코루틴실행: $i")
}
}
}
override fun onCleared() {
super.onCleared()
Log.d("MyViewModel", "뷰모델이 소멸되고 코루틴 스코프가 취소됨")
}
}
2) 사용예시(취소를 명시하지않아도된다)
class ExViewModel : ViewModel() {
private var memberRepository = MemberRepository()
var members: MutableLiveData<List<Member>> = MutableLiveData()
fun getUserData() {
viewModelScope.launch {
. . .
}
}
}
2. lifeCycleScope
라이프사이클 스코프는 프래그먼트나 액티비티의 생명주기에맞게 취소된다
프래그먼트와 액티비티 모두 onDestroy() 에서 자동취소됨
1) 액티비티에서 사용예시
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
repeat(10) { i ->
delay(1000L)
Log.d("MainActivity", "코루틴 실행: $i")
}
}
}
}
2) 프래그먼트에서 사용예시
class ExFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_ex, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
repeat(10) { i ->
delay(1000L)
Log.d("ExFragment", "코루틴 실행: $i")
}
}
}
}
3. 프래그먼트에서 viewLifecycleOwner.lifecycleScope
lifecycleScope는 Fragment의 onDestroy()에서 취소됨
하지만 viewLifecycleOwner.lifecycleScope는 프래그먼트의 onDestroyView()에서 취소된다
뷰가 없어지는 시점에서 코루틴을 중단해야 할 때 viewLifecycleOwner.lifecycleScope를 사용한다
뷰와관련된 작업(UI 업데이트 등)은 viewLifecycleOwner.lifecycleScope에서 하는것이 안전하다
class ExFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
repeat(10) { i ->
delay(1000L)
Log.d("MyFragment", "코루틴 실행: $i")
}
}
}
}