1.1 演进路线概览

Android 任务队列从早期简单解决方案发展到现代健壮框架,经历了数十个 API 等级的迭代。本章以全景图展示核心方案的生命周期、弃用节点与官方推荐替代路径,为后续章节的深入对比奠定基础。

Android 任务队列演进关系图 Android 任务队列演进全景关系图 AsyncTask API 1 · Deprecated API 30 HandlerThread API 1 · 建议迁移 Handler/Couroutine IntentService API 3 · Deprecated API 30 JobScheduler API 21 · 建议迁移 WorkManager WorkManager API 14+ (推荐 API 23+) 现代持久化任务调度 Kotlin Coroutines 独立库 · 协程挂起/恢复 RxJava 独立库 · 响应式流 @Deprecated 低效 → 分离 @Deprecated 推荐迁移 现代替代 协程支持 不同范式 说明:弧线箭头表示官方弃用路径;实线箭头表示演进或推荐替换;虚线表示不同方案间的关联。

核心任务队列对比

方案 引入 API 弃用状态 推荐替代方案
AsyncTask API 1 API 30 已弃用 WorkManager / Kotlin Coroutines
HandlerThread API 1 未弃用,但已过时 CoroutineScope + Dispatchers.IO
IntentService API 3 API 30 已弃用 WorkManager / JobIntentService (兼容)
JobScheduler API 21 未弃用,但建议迁移 WorkManager(统一调度)
WorkManager API 14+ 官方推荐 —(自身为现代标准)
Kotlin Coroutines 独立库 官方推荐 —(可与 WorkManager 结合)
RxJava 独立库 社区维护 Kotlin Coroutines(逐步迁移)
✏️ 弃用追踪建议
每当引入新依赖或修改旧代码,执行 ./gradlew lint 或 Android Studio 的 Lint 检查:
// 检查 AsyncTask 使用情况
lintOptions {
  abortOnError false
  check 'ObsoleteSdkInt'
}
Lint 会报告所有使用已弃用 API 的位置,并建议替代方案。

典型代码迁移示例

以下对比展示同一个“下载并保存文件”任务在 AsyncTask 与 WorkManager 中的实现差异:

// 旧方式:AsyncTask(API 30 弃用)
private class DownloadTask extends AsyncTask<String, Void, Boolean> {
    @Override
    protected Boolean doInBackground(String... url) {
        // 执行耗I/O操作
        return true;
    }
}
new DownloadTask().execute("https://example.com/file");
// 新方式:WorkManager(官方推荐)
class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
    override fun doWork(): Result {
        val url = inputData.getString("url") ?: return Result.failure()
        // 执行耗I/O操作
        return Result.success()
    }
}
val request = OneTimeWorkRequestBuilder<DownloadWorker>()
    .setInputData(workDataOf("url" to "https://example.com/file"))
    .build()
WorkManager.getInstance(context).enqueue(request)
⚠️ 关键警告
  • 不要在 Android 11 (API 30) 以上的设备上继续使用 AsyncTask,Google 已停止维护并可能在未来版本移除。
  • JobScheduler 在低端设备上存在调度对齐问题,WorkManager 自动处理了这些兼容性差异。
  • IntentService 虽在 API 30 标记弃用,但 JobIntentService 可作为过渡方案直到迁移完成。