Android多线程编程 #
一、线程基础 #
1.1 主线程与子线程 #
Android应用运行在主线程(UI线程)中,耗时操作必须在子线程执行。
kotlin
// 创建线程
Thread {
// 耗时操作
val result = doWork()
// 更新UI需要在主线程
runOnUiThread {
updateUI(result)
}
}.start()
// 使用线程池
val executor = Executors.newFixedThreadPool(4)
executor.execute {
// 耗时操作
}
1.2 线程同步 #
kotlin
// synchronized
@Synchronized
fun synchronizedMethod() {
// 同步代码
}
// Lock
val lock = ReentrantLock()
lock.lock()
try {
// 同步代码
} finally {
lock.unlock()
}
二、Handler #
2.1 Handler基本使用 #
kotlin
class MainActivity : AppCompatActivity() {
private val handler = Handler(Looper.getMainLooper())
private val runnable = object : Runnable {
override fun run() {
// 更新UI
updateUI()
handler.postDelayed(this, 1000)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 延迟执行
handler.postDelayed(runnable, 1000)
}
override fun onDestroy() {
super.onDestroy()
handler.removeCallbacks(runnable)
}
}
2.2 HandlerThread #
kotlin
class MyHandlerThread : HandlerThread("MyThread") {
private lateinit var handler: Handler
override fun onLooperPrepared() {
handler = Handler(looper)
}
fun postTask(task: Runnable) {
handler.post(task)
}
}
// 使用
val handlerThread = MyHandlerThread()
handlerThread.start()
handlerThread.postTask {
// 后台任务
}
2.3 Handler消息机制 #
kotlin
class MainActivity : AppCompatActivity() {
private val handler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
when (msg.what) {
1 -> {
val data = msg.obj as String
updateUI(data)
}
}
}
}
fun sendMessage() {
Thread {
val result = doWork()
val message = handler.obtainMessage(1, result)
handler.sendMessage(message)
}.start()
}
}
三、协程 #
3.1 添加依赖 #
kotlin
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
}
3.2 启动协程 #
kotlin
// GlobalScope(不推荐)
GlobalScope.launch {
// 协程代码
}
// lifecycleScope(推荐)
lifecycleScope.launch {
// 协程代码
}
// viewModelScope(推荐)
viewModelScope.launch {
// 协程代码
}
3.3 协程构建器 #
kotlin
// launch:启动新协程,不返回结果
lifecycleScope.launch {
delay(1000)
println("Hello")
}
// async:启动新协程,返回Deferred
lifecycleScope.launch {
val deferred = async {
delay(1000)
"Result"
}
val result = deferred.await()
}
// withContext:切换上下文
lifecycleScope.launch {
val result = withContext(Dispatchers.IO) {
// IO操作
fetchData()
}
// 更新UI
updateUI(result)
}
3.4 调度器 #
| 调度器 | 用途 |
|---|---|
| Dispatchers.Main | 主线程,用于UI操作 |
| Dispatchers.IO | IO线程,用于网络、文件操作 |
| Dispatchers.Default | 默认线程,用于CPU密集型任务 |
| Dispatchers.Unconfined | 不指定线程 |
kotlin
lifecycleScope.launch(Dispatchers.IO) {
// IO操作
val data = fetchData()
withContext(Dispatchers.Main) {
// 更新UI
updateUI(data)
}
}
3.5 协程作用域 #
kotlin
// 自定义作用域
class MyManager {
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
fun doWork() {
scope.launch {
// 协程代码
}
}
fun cancel() {
scope.cancel()
}
}
3.6 异常处理 #
kotlin
lifecycleScope.launch {
try {
val result = withContext(Dispatchers.IO) {
fetchData()
}
updateUI(result)
} catch (e: Exception) {
showError(e.message)
}
}
// 使用CoroutineExceptionHandler
val handler = CoroutineExceptionHandler { _, exception ->
Log.e("Coroutine", "Error", exception)
}
lifecycleScope.launch(handler) {
// 协程代码
}
3.7 Flow #
kotlin
fun getData(): Flow<Result<Data>> = flow {
emit(Result.Loading)
try {
val data = repository.getData()
emit(Result.Success(data))
} catch (e: Exception) {
emit(Result.Error(e.message))
}
}
// 使用
lifecycleScope.launch {
viewModel.getData()
.flowOn(Dispatchers.IO)
.collect { result ->
when (result) {
is Result.Loading -> showLoading()
is Result.Success -> showData(result.data)
is Result.Error -> showError(result.message)
}
}
}
四、线程池 #
4.1 使用线程池 #
kotlin
// 固定大小线程池
val fixedPool = Executors.newFixedThreadPool(4)
// 缓存线程池
val cachedPool = Executors.newCachedThreadPool()
// 单线程池
val singlePool = Executors.newSingleThreadExecutor()
// 定时线程池
val scheduledPool = Executors.newScheduledThreadPool(2)
// 使用
fixedPool.execute {
// 任务
}
// 关闭
fixedPool.shutdown()
4.2 使用ThreadPoolExecutor #
kotlin
val executor = ThreadPoolExecutor(
4, // 核心线程数
8, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS,
LinkedBlockingQueue(128),
ThreadFactory { r -> Thread(r, "MyThread") }
)
五、最佳实践 #
5.1 使用协程替代线程 #
kotlin
// 不推荐
Thread {
val result = doWork()
runOnUiThread {
updateUI(result)
}
}.start()
// 推荐
lifecycleScope.launch {
val result = withContext(Dispatchers.IO) {
doWork()
}
updateUI(result)
}
5.2 避免内存泄漏 #
kotlin
class MainActivity : AppCompatActivity() {
private var job: Job? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = lifecycleScope.launch {
// 协程代码
}
}
override fun onDestroy() {
super.onDestroy()
job?.cancel()
}
}
5.3 使用结构化并发 #
kotlin
lifecycleScope.launch {
// 父协程
launch {
// 子协程1
}
launch {
// 子协程2
}
}
// 父协程取消时,子协程也会取消
六、总结 #
本章详细介绍了Android多线程编程:
- 线程基础和同步
- Handler消息机制
- 协程的使用
- 线程池配置
- 最佳实践
协程是Android推荐的异步处理方案,相比传统线程更加简洁高效。
最后更新:2026-03-26