MainViewModel.kt
import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch class MainViewModel : ViewModel() { private val _counter = MutableStateFlow(0) val counter: StateFlow<Int> = _counter fun startCounting() { viewModelScope.launch { for (i in 1..10) { delay(1000) // 1秒待つ _counter.value = i } } } }
package com.example.myapplicationcoroutine import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import android.widget.Button import android.widget.TextView import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import com.example.myapplicationcoroutine.ui.theme.MyApplicationCoroutineTheme class MainActivity : ComponentActivity() { private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val counterTextView = findViewById<TextView>(R.id.counterTextView) val startButton = findViewById<Button>(R.id.startButton) // ボタンを押すとカウントスタート startButton.setOnClickListener { viewModel.startCounting() } // Flowを監視してUI更新 lifecycleScope.launch { viewModel.counter.collectLatest { value -> counterTextView.text = "カウント: $value" } } } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:padding="16dp"> <TextView android:id="@+id/counterTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="カウント: 0" android:textSize="24sp" android:layout_marginBottom="24dp"/> <Button android:id="@+id/startButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="カウント開始"/> </LinearLayout>