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")
            }
        }
    }
}