WorkManager และงานเบื้องหลัง
กำหนดเวลางานเบื้องหลังที่รับประกันการทำงานด้วย WorkManager ใช้ OneTimeWorkRequest, PeriodicWorkRequest, เงื่อนไขจำกัด การส่งข้อมูล และการเชื่อมโยงงาน
WorkManager และงานเบื้องหลัง เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 5 จากทั้งหมด 6 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
งานเบื้องหลังใน Android
Android จำกัดงานเบื้องหลังอย่างเข้มงวดเพื่อประหยัดแบตเตอรี่ ก่อนมี WorkManager นักพัฒนาใช้สิ่งต่อไปนี้:
- AsyncTask (เลิกใช้งานแล้ว)
- AlarmManager (ไม่น่าเชื่อถือเมื่ออุปกรณ์รีสตาร์ตหรืออยู่ในโหมด Doze)
- JobScheduler (API ซับซ้อน)
- บริการ (อาจถูกปิด และไม่มีการลองใหม่)
WorkManager เป็นโซลูชันที่แนะนำสำหรับงานเบื้องหลังที่เลื่อนเวลาได้และรับประกันว่าจะทำงาน
WorkManager คืออะไร
WorkManager รับประกันว่างานของคุณจะทำงานแม้แอปถูกปิดหรืออุปกรณ์รีสตาร์ต โดยมีความสามารถดังนี้:
- คงงานไว้แม้อุปกรณ์รีสตาร์ต
- ลองใหม่โดยอัตโนมัติเมื่อเกิดข้อผิดพลาด
- รองรับเงื่อนไข เช่น ใช้ WiFi เท่านั้น หรือทำงานขณะชาร์จเท่านั้น
- ทำงานบน API 14 ขึ้นไป
- ทำงานร่วมกับ Kotlin Coroutines ผ่าน
CoroutineWorker
การตั้งค่า
เพิ่ม WorkManager ลงใน app/build.gradle:
dependencies {
implementation 'androidx.work:work-runtime-ktx:2.9.0'
}การสร้าง Worker
สืบทอดจาก CoroutineWorker และใช้งาน doWork() จากนั้นส่งคืน Result.success(), Result.failure() หรือ Result.retry():
class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
// This runs on a background coroutine
val repo = UserRepository(applicationContext)
repo.syncFromNetwork()
Result.success()
} catch (e: Exception) {
if (runAttemptCount < 3) Result.retry()
else Result.failure()
}
}
}OneTimeWorkRequest
ตั้งเวลางานที่ทำครั้งเดียวและเพิ่มงานเข้าคิว:
val syncWork = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(10, TimeUnit.MINUTES) // optional delay
.build()
WorkManager.getInstance(context).enqueue(syncWork)
// With a unique name (prevents duplicates):
WorkManager.getInstance(context).enqueueUniqueWork(
"sync_work",
ExistingWorkPolicy.KEEP, // don't enqueue if already pending
syncWork
)PeriodicWorkRequest
ตั้งเวลางานที่ทำซ้ำ โดยช่วงเวลาขั้นต่ำคือ 15 นาที:
val periodicSync = PeriodicWorkRequestBuilder<SyncWorker>(
repeatInterval = 1, TimeUnit.HOURS
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"hourly_sync",
ExistingPeriodicWorkPolicy.KEEP,
periodicSync
)เงื่อนไข
ทำงานเฉพาะเมื่อเงื่อนไขครบถ้วน เช่น แบตเตอรี่ไม่ต่ำและเชื่อมต่อ WiFi อยู่:
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED) // WiFi only
.setRequiresBatteryNotLow(true)
.setRequiresCharging(false)
.build()
val work = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(constraints)
.build()
WorkManager.getInstance(context).enqueue(work)ข้อมูลนำเข้าและข้อมูลส่งออก
ส่งข้อมูลเข้าและออกจาก Worker โดยใช้วัตถุ Data:
// Enqueue with input data:
val inputData = workDataOf("user_id" to 42)
val work = OneTimeWorkRequestBuilder<SyncWorker>()
.setInputData(inputData)
.build()
// Inside the Worker:
class SyncWorker(...) : CoroutineWorker(...) {
override suspend fun doWork(): Result {
val userId = inputData.getInt("user_id", -1)
// Pass output data back:
val output = workDataOf("synced_count" to 10)
return Result.success(output)
}
}การสังเกตสถานะงาน
สังเกตความคืบหน้าของงานโดยใช้ getWorkInfoByIdLiveData:
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>().build()
WorkManager.getInstance(this).enqueue(workRequest)
WorkManager.getInstance(this)
.getWorkInfoByIdLiveData(workRequest.id)
.observe(this) { info ->
when (info?.state) {
WorkInfo.State.RUNNING -> binding.tvStatus.text = "Syncing..."
WorkInfo.State.SUCCEEDED -> binding.tvStatus.text = "Done!"
WorkInfo.State.FAILED -> binding.tvStatus.text = "Failed"
else -> {}
}
}การเชื่อมต่องาน
เรียกใช้งานตามลำดับหรือพร้อมกันโดยใช้ห่วงโซ่งาน:
val downloadWork = OneTimeWorkRequestBuilder<DownloadWorker>().build()
val processWork = OneTimeWorkRequestBuilder<ProcessWorker>().build()
val uploadWork = OneTimeWorkRequestBuilder<UploadWorker>().build()
// Sequential: download → process → upload
WorkManager.getInstance(context)
.beginWith(downloadWork)
.then(processWork)
.then(uploadWork)
.enqueue()
// Parallel then merge:
WorkManager.getInstance(context)
.beginWith(listOf(downloadWork, processWork)) // both run in parallel
.then(uploadWork) // runs after both finish
.enqueue()WorkManager เทียบกับทางเลือกอื่น
เลือกใช้เครื่องมือให้เหมาะกับงาน:
- WorkManager — งานที่เลื่อนเวลาได้ รับประกันการทำงาน และอิงตามเงื่อนไข เหมาะที่สุดสำหรับการซิงค์ การอัปโหลด และการล้างข้อมูล
- Coroutines / ViewModel — งานที่ผูกกับการเปิดแอป จะหยุดเมื่อแอปถูกปิด
- AlarmManager — การปลุกตามเวลาที่แน่นอน เช่น การเตือนในปฏิทิน ต้องจัดการแบตเตอรี่อย่างรอบคอบ
- Foreground Service — งานที่ทำต่อเนื่องเป็นเวลานานและผู้ใช้รับรู้ เช่น การเล่นเพลงหรือการนำทาง
ตรวจสอบความเข้าใจ
ช่วงเวลาการทำซ้ำขั้นต่ำของ PeriodicWorkRequest คือเท่าใด
สรุป: WorkManager
WorkManager เป็นเครื่องมือที่เหมาะสำหรับงานเบื้องหลังที่ต้องรับประกันการทำงาน:
- สืบทอดจาก
CoroutineWorkerและใช้งานdoWork() - ส่งคืน
Result.success(),.failure()หรือ.retry() - ใช้
OneTimeWorkRequestสำหรับการทำงานครั้งเดียว และPeriodicWorkRequestสำหรับการทำงานซ้ำ - เพิ่ม
Constraintsสำหรับเงื่อนไข เช่น ใช้ WiFi เท่านั้นหรือเงื่อนไขแบตเตอรี่ - ส่งข้อมูลด้วย
workDataOf() - เชื่อมต่องานด้วย
beginWith().then().enqueue()
ถัดไป: คอมโพเนนต์ Material Design สำหรับ UI ที่สวยงาม
คำถามที่พบบ่อย
บทเรียน “WorkManager และงานเบื้องหลัง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “WorkManager และงานเบื้องหลัง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “WorkManager และงานเบื้องหลัง”
กำหนดเวลางานเบื้องหลังที่รับประกันการทำงานด้วย WorkManager ใช้ OneTimeWorkRequest, PeriodicWorkRequest, เงื่อนไขจำกัด การส่งข้อมูล และการเชื่อมโยงงาน คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 5 จากทั้งหมด 6 บทเรียน
บทเรียน “WorkManager และงานเบื้องหลัง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม
ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Retrofit และ REST APIs
- การโหลดรูปภาพด้วย Coil
- การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้
- การแจ้งเตือนแบบพุช
- WorkManager และงานเบื้องหลัง
- การเผยแพร่ไปยัง Play Store