在 Android 开发中,耗时操作(如网络请求、数据库访问、大文件读写等)不能放在主线程(UI 线程)中执行,否则会引起应用卡顿甚至 ANR(Application Not Responding)异常。
常见的处理耗时操作的方法:
---
✅ 1. 使用 `HandlerThread` + `Handler`
适合对线程管理有一定控制需求的场景。
```java
HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
Handler backgroundHandler = new Handler(handlerThread.getLooper());
backgroundHandler.post(() -> {
// 耗时操作
});
```
---
✅ 2. 使用 `AsyncTask`(已废弃,不推荐)
虽然老项目中可能看到,但已在 API 30 被废弃。可使用更现代的方式替代。
---
✅ 3. 使用 `ExecutorService` / `ThreadPoolExecutor`
适合对线程池控制要求较高的场景。
```java
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
// 耗时操作
});
```
---
✅ 4. 使用 Kotlin 协程(推荐 Kotlin 项目)
如果你使用 Kotlin,协程是现代异步处理的主流方法:
```kotlin
lifecycleScope.launch {
withContext(Dispatchers.IO) {
// 耗时操作,例如网络请求
}
}
```
还可以结合 Retrofit、Room 等库自动切换线程。
---
✅ 5. 使用 WorkManager / JobScheduler
适用于后台任务调度(定时任务、后台任务,持久性任务):
```java
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class).build();
WorkManager.getInstance(context).enqueue(workRequest);
```
---
✅ 6. 使用 RxJava(响应式编程)
对于响应式编程喜欢用的同学:
```java
Observable.fromCallable(() -> {
// 耗时操作
return result;
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
// UI更新
});
```
---
⚠️ 小贴士:
- 主线程只负责 UI 操作,所有耗时的都放到后台线程!
- 使用现代方式推荐:`Kotlin Coroutine` 或 `WorkManager`。
- 切记操作完成后,回到主线程更新 UI(除非你用的框架已自动处理)。
---
你项目是用 Java 还是 Kotlin?我可以给你更具体的写法~