Loading...
Loading...
Compare original and translation side by side
// ✅ ViewModel scope (auto-cancelled)
class HomeViewModel : ViewModel() {
fun loadData() {
viewModelScope.launch {
// Cancelled when ViewModel cleared
}
}
}
// ✅ Lifecycle scope
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
// Cancelled when lifecycle destroyed
}
}
}
// ❌ AVOID: GlobalScope
GlobalScope.launch { } // Never cancelled, memory leaks// ✅ ViewModel scope(自动取消)
class HomeViewModel : ViewModel() {
fun loadData() {
viewModelScope.launch {
// 当ViewModel被销毁时自动取消
}
}
}
// ✅ Lifecycle作用域
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
// 当生命周期销毁时自动取消
}
}
}
// ❌ 避免使用:GlobalScope
GlobalScope.launch { } // 永远不会取消,会造成内存泄漏// Main - UI operations
withContext(Dispatchers.Main) {
textView.text = "Updated"
}
// IO - Network, disk
withContext(Dispatchers.IO) {
api.fetchData()
database.query()
}
// Default - CPU intensive
withContext(Dispatchers.Default) {
list.sortedBy { it.score }
}// Main - UI操作
withContext(Dispatchers.Main) {
textView.text = "Updated"
}
// IO - 网络、磁盘操作
withContext(Dispatchers.IO) {
api.fetchData()
database.query()
}
// Default - CPU密集型操作
withContext(Dispatchers.Default) {
list.sortedBy { it.score }
}// StateFlow for UI state
private val _state = MutableStateFlow(HomeState())
val state: StateFlow<HomeState> = _state.asStateFlow()
// SharedFlow for events
private val _events = MutableSharedFlow<Event>()
val events: SharedFlow<Event> = _events.asSharedFlow()
// Collect with lifecycle
@Composable
fun HomeScreen(viewModel: HomeViewModel) {
val state by viewModel.state.collectAsStateWithLifecycle()
}// StateFlow用于管理UI状态
private val _state = MutableStateFlow(HomeState())
val state: StateFlow<HomeState> = _state.asStateFlow()
// SharedFlow用于事件处理
private val _events = MutableSharedFlow<Event>()
val events: SharedFlow<Event> = _events.asSharedFlow()
// 结合生命周期收集流
@Composable
fun HomeScreen(viewModel: HomeViewModel) {
val state by viewModel.state.collectAsStateWithLifecycle()
}flow
.filter { it.isActive }
.map { transform(it) }
.distinctUntilChanged()
.debounce(300)
.catch { emit(fallback) }
.collect { process(it) }flow
.filter { it.isActive }
.map { transform(it) }
.distinctUntilChanged()
.debounce(300)
.catch { emit(fallback) }
.collect { process(it) }// Try-catch in coroutine
viewModelScope.launch {
try {
val result = repository.fetchData()
_state.value = Success(result)
} catch (e: Exception) {
_state.value = Error(e.message)
}
}
// supervisorScope - siblings don't cancel
supervisorScope {
launch { task1() } // Failure doesn't cancel task2
launch { task2() }
}// 在协程中使用try-catch
viewModelScope.launch {
try {
val result = repository.fetchData()
_state.value = Success(result)
} catch (e: Exception) {
_state.value = Error(e.message)
}
}
// supervisorScope - 子协程失败不会取消其他兄弟协程
supervisorScope {
launch { task1() } // 失败不会取消task2
launch { task2() }
}// Cooperative cancellation
suspend fun processItems(items: List<Item>) {
items.forEach { item ->
ensureActive() // Check cancellation
process(item)
}
}
// CancellationException handling
try {
coroutineWork()
} catch (e: CancellationException) {
throw e // Don't swallow!
} catch (e: Exception) {
handleError(e)
}// 协作式取消
suspend fun processItems(items: List<Item>) {
items.forEach { item ->
ensureActive() // 检查取消状态
process(item)
}
}
// CancellationException异常处理
try {
coroutineWork()
} catch (e: CancellationException) {
throw e // 不要吞掉该异常!
} catch (e: Exception) {
handleError(e)
}