Sử dụng Scheduling tasks with Work Manager (P.2)

phần trước mình cũng đã giới thiệu cho các bạn khá nhiều thông tin vè Work Manager, Background schedule task.

Ở phần này mình sẽ đề cập cụ thể hơn về các thành phần trong work manager.

1. Classes and concepts

Work manager có các class chính mà chúng ta cần quan tâm gồm:

Worker:  WorkManager cung cấp 1 abstract Worker. Chúng ta cần extend class này và triển khai các công việc cần thực hiện ở đây.

WorkRequest: chúng ta có thể hiểu đơn giản class này đại diện cho 1 yêu cầu để thực thi công việc. Mỗi WorkRequest có một ID duy nhất được tạo tự động, có thể sử dụng ID để  hủy một công việc xếp hàng đợi hoặc nhận trạng thái của tác vụ.
WorkRequest là một lớp trừu tượng; gồm 2 class con OneTimeWorkRequest hoặc PeriodicWorkRequest.

WorkRequest.Builder: được dùng để khởi tạo các đối tượng WorkRequest. Tương ứng với 2 lớp con : OneTimeWorkRequest.Builder hoặc PeriodicWorkRequest.Builder. Bạn có thể tạo đối tượng Constraints với Constraints.Builder và chuyển các ràng buộc tới WorkRequest.Builder trước khi tạo WorkRequest. Ví dụ: chỉ định các hạn chế về thời điểm tác vụ sẽ chạy (ví dụ: chỉ khi được kết nối với mạng, chỉ khi sạc pin…)

WorkManager: đây là một class quản lý và thực hiện công việc lên lịch các task mà bạn đã định nghĩa trong WorkRequest.

WorkStatus: lớp này chứa trạng thái của tất cả các Work Request trả về dạng LiveData. LiveData chứa đối tượng WorkStatus, bằng cách quan sát LiveData, bạn có thể xác định trạng thái hiện tại của tác vụ và nhận bất kỳ giá trị trả về nào sau khi tác vụ kết thúc. Ngoài ra đừng quên bạn có thể query dựa trên id của WorkRequest để lấy status.

2. Workflow to schedule work

2.1 Tạo 1 Work:

Để tạo 1 Work bạn chỉ cần extends class Worker và overrice phương thức doWork() của nó.
– Extends lớp Worker
– Thực thi công việc trong doWork:
– Trả về status:  SUCCESS /RETRY /FAILURE

public class SaveImageWorker extends Worker {
@Override
public Worker.WorkerResult doWork() {
    //Thực hiện task tại đây. 
    saveImage();
    // Trả về trạng thái.
    return WorkerResult.SUCCESS; 
    // RETRY nếu thất bại. Task sẽ được thực thi lại
    // FAILURE nếu muốn kết thúc, không thực thi lại.
}
}

2.2 Khai báo các ràng buộc

Bạn có thể tiến hành khai báo các ràng buộc cho WorkManager để quyết định khi nào thì sẽ tiến hành lên schedule. Mặc định không khai báo thì task sẽ chạy ngay lập tức.
Ví dụ:
Tiến hành ràng buộc chỉ thực khi khi:
– Điện thoại ở chế độ rảnh rỗi
– Khi đang sạc.
Lưu ý có rất nhiều ràng buộc trong lớp Constraints.Builder.

Constraints myConstraints = new Constraints.Builder()
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
.build();

Để tiến hành set Constrants chỉ cần set Constrants vào request bằng cách sử dụng hàm:

OneTimeWorkRequest saveRequest =
            new OneTimeWorkRequest.Builder(SaveWorker.class)
 .setConstraints(myConstraints)
 .build();

2.3 Tạo 1 Work Request:

Giống như đã đề cập ở trên có 2 cách taọ Work Request tuỳ theo nhu cầu:
– Sử dụng : OneTimeWorkRequest để thực thị 1 lần duy nhất:

 OneTimeWorkRequest saveRequest =
          new OneTimeWorkRequest.Builder(SaveWorker.class)
 .build();

– Sử dụng: PeriodicWorkRequest dùng để tạo công việc định kỳ theo 1 khoảng thời gian nhất định.

PeriodicWorkRequest  saveRequest  =
         new PeriodicWorkRequest.Builder(SaveWorker.class, 12, TimeUnit.HOURS)
.build();

2.4 Lập lịch Request:

Để lập lịch một Request chúng ta chỉ cần gọi WorkManager  để tiến hành lên lịch:

WorkManager.getInstance().enqueue(request)

2.5 Canceling a Task

Để tiến hành Cancel 1 task đã lên lịch trước đó chỉ cần lấy UUID của task đó trong class WorkRequest tương ứng.

UUID saveWorkId = saveRequest.getId();
WorkManager.getInstance().cancelByWorkId(saveWorkId);

Ở phần này chúng ta sẽ tạm dừng tại đây, các bạn có thể tìm hiểu thêm nhiều hơn về các phần nâng cao như: Truyền tham số vào worker, lắng nghe kết quả, thực hiện tuần tự các task.

Ngoài ra các bạn có thể thực hành theo hướng dẫn step by step của google tại đây.

Nguyễn Linh

Chia sẻ để cùng tiến bộ...