वर्कर में थ्रेडिंग

Worker का इस्तेमाल करने पर, WorkManager Worker.doWork() को अपने-आप कॉल करता है बैकग्राउंड थ्रेड पर. बैकग्राउंड थ्रेड, Executor से मिलता है WorkManager के Configuration में बताया गया है. डिफ़ॉल्ट रूप से, WorkManager आपके लिए Executor सेट अप करता है. हालांकि, आपके पास इन्हें अपनी पसंद के मुताबिक बनाने का विकल्प भी है आपकी अपनी पसंद के हिसाब से. उदाहरण के लिए, आप अपने ऐप्लिकेशन, सिंगल-थ्रेड वाला Executor बनाएं, ताकि बैकग्राउंड में आपका पूरा डेटा काम कर सके क्रम से लागू करता है या पसंद के मुताबिक Executor तय करता है. कस्टमाइज़ करने के लिए Executor, पक्का करें कि आपने WorkManager को मैन्युअल तरीके से शुरू किया हो.

WorkManager को मैन्युअल तरीके से कॉन्फ़िगर करते समय, अपने Executor को इस हिसाब से कॉन्फ़िगर किया जा सकता है अनुसरण करता है:

Kotlin

WorkManager.initialize(
    context,
    Configuration.Builder()
         // Uses a fixed thread pool of size 8 threads.
        .setExecutor(Executors.newFixedThreadPool(8))
        .build())

Java

WorkManager.initialize(
    context,
    new Configuration.Builder()
        .setExecutor(Executors.newFixedThreadPool(8))
        .build());

यहां एक सामान्य Worker का उदाहरण दिया गया है, जो किसी वेबपेज का कॉन्टेंट डाउनलोड करता है 100 बार:

Kotlin

class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

    override fun doWork(): ListenableWorker.Result {
        repeat(100) {
            try {
                downloadSynchronously("https://www.google.com")
            } catch (e: IOException) {
                return ListenableWorker.Result.failure()
            }
        }

        return ListenableWorker.Result.success()
    }
}

Java

public class DownloadWorker extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {
        for (int i = 0; i < 100; i++) {
            try {
                downloadSynchronously("https://www.google.com");
            } catch (IOException e) {
                return Result.failure();
            }
        }

        return Result.success();
    }

}

ध्यान दें कि Worker.doWork() सिंक्रोनस कॉल—आपको बैकग्राउंड का पूरा काम Google में एक ब्लॉकिंग फ़ैशन को रोकना और उसे उस समय तक पूरा करना जब तक उसे बाहर नहीं निकाला जाता. अगर आप किसी doWork() में एसिंक्रोनस एपीआई और Result दिखाता है, तो हो सकता है कि आपका कॉलबैक ये काम न करे ठीक से काम करते हों. अगर आपके साथ भी ऐसा होता है, तो ListenableWorker का इस्तेमाल करें. (ExploreableWorker में थ्रेडिंग), तब ऐसा कर सकती है.

जब वर्तमान में चल रहा Worker किसी भी कारण से बंद हो जाता है, तो वह Worker.onStopped() पर एक कॉल आता है. इस तरीके को बदलें या Worker.isStopped() को कॉल करो कोड चेकइन करने और ज़रूरत पड़ने पर संसाधनों को खाली करने के लिए. जब Worker जो ऊपर दिए गए उदाहरण में रुकी हुई है, वह शायद अपने आइटम डाउनलोड कर रहा है और ऐसा करना जारी रखेगा, भले ही उसे रोक दिया गया हो. यहां की यात्रा पर हूं ऑप्टिमाइज़ करते हैं, तो आप कुछ ऐसा कर सकते हैं:

Kotlin

class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

    override fun doWork(): ListenableWorker.Result {
        repeat(100) {
            if (isStopped) {
                break
            }

            try {
                downloadSynchronously("https://www.google.com")
            } catch (e: IOException) {
                return ListenableWorker.Result.failure()
            }

        }

        return ListenableWorker.Result.success()
    }
}

Java

public class DownloadWorker extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {
        for (int i = 0; i < 100; ++i) {
            if (isStopped()) {
                break;
            }

            try {
                downloadSynchronously("https://www.google.com");
            } catch (IOException e) {
                return Result.failure();
            }
        }

        return Result.success();
    }
}

Worker को बंद करने के बाद, इससे कोई फ़र्क़ नहीं पड़ता कि आपने किस साइट से वापस आया है Worker.doWork(); Result को अनदेखा कर दिया जाएगा.