Tạo luồng trong RxWorker

Chúng tôi cung cấp khả năng tương tác giữa WorkManager và RxJava. Để bắt đầu, hãy thêm phần phụ thuộc work-rxjava3 cùng với work-runtime vào tệp gradle. Bên cạnh đó, bạn cũng thể thêm phần phụ thuộc work-rxjava2 hỗ trợ rxjava2.

Sau đó, hãy gia hạn RxWorker thay vì Worker. Cuối cùng, hãy ghi đè lên phương thức RxWorker.createWork() để trả về một Single<Result> cho biết Result của quá trình thực thi, như ví dụ bên dưới:

Kotlin

class RxDownloadWorker(
        context: Context,
        params: WorkerParameters
) : RxWorker(context, params) {
    override fun createWork(): Single<Result> {
        return Observable.range(0, 100)
                .flatMap { download("https://www.example.com") }
                .toList()
                .map { Result.success() }
    }
}

Java

public class RxDownloadWorker extends RxWorker {

    public RxDownloadWorker(Context context, WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Single<Result> createWork() {
        return Observable.range(0, 100)
            .flatMap { download("https://www.example.com") }
            .toList()
            .map { Result.success() };
    }
}

Xin lưu ý rằng mặc dù RxWorker.createWork() được gọi trên luồng (thread) chính nhưng theo mặc định, giá trị trả về được đăng ký trên luồng nền. Bạn có thể ghi đè RxWorker.getBackgroundScheduler() để thay đổi gói thuê bao.

Khi một RxWorker ở trạng thái onStopped() thì gói thuê bao sẽ bị dừng. Vì vậy, bạn không cần phải xử lý sự cố công việc ngừng hoạt động bằng biện pháp đặc biệt nào.