Threading ב-RxWorker

אנחנו מספקים יכולת פעולה הדדית בין WorkManager לבין RxJava. כדי להתחיל בעבודה, כוללים תלות מסוג work-rxjava3 בנוסף ל-work-runtime בקובץ Gradle. יש גם תלות ב-work-rxjava2 שתומכת ב-rxjava2 במקום זאת.

לאחר מכן, במקום להאריך Worker, צריך להאריך את RxWorker. סוף סוף כאן לשנות את הערך של RxWorker.createWork(). שתחזיר Single<Result> שמציין את Result של הביצוע, כפי ככה:

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() };
    }
}

חשוב לזכור שהשדה RxWorker.createWork() נקרא בשרשור הראשי, אבל מוחזר כברירת מחדל, הערך רשום בשרשור ברקע. אפשר לעקוף את RxWorker.getBackgroundScheduler() כדי לשנות את להרשמה לשרשור.

כאשר RxWorker יהיה onStopped(), המינוי יימחק, כך אין צורך לטפל בחסימות בעבודה בשום צורה.