Worker
का इस्तेमाल करने पर, WorkManager
Worker.doWork()
को अपने-आप कॉल करता है
बैकग्राउंड थ्रेड पर. बैकग्राउंड थ्रेड, Executor
से मिलता है
WorkManager के Configuration
में बताया गया है.
डिफ़ॉल्ट रूप से, WorkManager आपके लिए Executor
सेट अप करता है. हालांकि, आपके पास इन्हें अपनी पसंद के मुताबिक बनाने का विकल्प भी है
आपकी अपनी पसंद के हिसाब से. उदाहरण के लिए, आप अपने
ऐप्लिकेशन, सिंगल-थ्रेड वाला Executor
बनाएं, ताकि बैकग्राउंड में आपका पूरा डेटा काम कर सके
क्रम से लागू करता है या पसंद के मुताबिक Executor
तय करता है. कस्टमाइज़ करने के लिए
Executor
, पक्का करें कि आपने WorkManager को मैन्युअल तरीके से शुरू किया हो.
WorkManager को मैन्युअल तरीके से कॉन्फ़िगर करते समय, अपने Executor
को इस हिसाब से कॉन्फ़िगर किया जा सकता है
अनुसरण करता है:
WorkManager.initialize( context, Configuration.Builder() // Uses a fixed thread pool of size 8 threads. .setExecutor(Executors.newFixedThreadPool(8)) .build())
WorkManager.initialize( context, new Configuration.Builder() .setExecutor(Executors.newFixedThreadPool(8)) .build());
यहां एक सामान्य Worker
का उदाहरण दिया गया है, जो किसी वेबपेज का कॉन्टेंट डाउनलोड करता है
100 बार:
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() } }
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
जो ऊपर दिए गए उदाहरण में रुकी हुई है, वह शायद अपने
आइटम डाउनलोड कर रहा है और ऐसा करना जारी रखेगा, भले ही उसे रोक दिया गया हो. यहां की यात्रा पर हूं
ऑप्टिमाइज़ करते हैं, तो आप कुछ ऐसा कर सकते हैं:
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() } }
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
को अनदेखा कर दिया जाएगा.