0Pricing
Android Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Retrofit และ REST APIs
  2. การโหลดรูปภาพด้วย Coil
  3. การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้
  4. การแจ้งเตือนแบบพุช
  5. WorkManager และงานเบื้องหลัง
  6. การเผยแพร่ไปยัง Play Store
← กลับไปที่ Android Academy