CoroutineWorker-এ থ্রেডিং

Kotlin ব্যবহারকারীদের জন্য, WorkManager coroutines-এর জন্য ফার্স্ট-ক্লাস সহায়তা প্রদান করে। শুরু করতে, আপনার gradle ফাইলে work-runtime-ktx অন্তর্ভুক্ত করুন। Worker এক্সটেন্ড করার পরিবর্তে, আপনার CoroutineWorker এক্সটেন্ড করা উচিত, যার মধ্যে doWork()-এর সাসপেন্ডিং ভার্সন আছে। যেমন, আপনি যদি কিছু নেটওয়ার্ক অপারেশন পারফর্ম করার জন্য একটি সাধারণ CoroutineWorker তৈরি করতে চান, তাহলে আপনাকে নিম্নলিখিত কাজগুলি করতে হবে:

class CoroutineDownloadWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        val data = downloadSynchronously("https://www.google.com")
        saveData(data)
        return Result.success()
    }
}

মনে রাখবেন যে CoroutineWorker.doWork() হল একটি সাসপেন্ডিং ফাংশন। Worker-এর মতো এই কোড আপনার Configuration-এ উল্লেখ করা Executor-এ রান করে না। পরিবর্তে, এটি ডিফল্ট হিসেবে Dispatchers.Default-এ সেট করা থাকে। আপনার নিজের CoroutineContext প্রদান করে আপনি এটি কাস্টমাইজ করতে পারবেন। উপরের উদাহরণে, আপনি হয়ত Dispatchers.IO-এ এই কাজ করতে চাইবেন, যেমন:

class CoroutineDownloadWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        withContext(Dispatchers.IO) {
            val data = downloadSynchronously("https://www.google.com")
            saveData(data)
            return Result.success()
        }
    }
}

CoroutineWorker কো-রুটিন বাতিল করে এবং বাতিল করার সিগন্যাল প্রচার করে অটোমেটিক স্টপেজ ম্যানেজ করে। কাজ বন্ধ হয়ে যাওয়া ম্যানেজ করার জন্য আপনাকে বিশেষ কিছু করতে হবে না।

অন্য প্রসেসে CoroutineWorker চালানো

এছাড়াও, আপনি RemoteCoroutineWorker, ListenableWorker-এর একটি ইমপ্লিমেন্টেশন ব্যবহার করে কোনও নির্দিষ্ট প্রসেসে একজন কর্মীকে বাইন্ড করতে পারেন।

RemoteCoroutineWorker দুটি অতিরিক্ত আর্গুমেন্ট সহ একটি নির্দিষ্ট প্রসেসের সাথে বাইন্ড করে যা আপনি কাজের অনুরোধ তৈরি করার সময় ইনপুট ডেটার অংশ হিসেবে প্রদান করেন: ARGUMENT_CLASS_NAME এবং ARGUMENT_PACKAGE_NAME।

নিম্নলিখিত উদাহরণটি একটি কাজের অনুরোধ তৈরি করার প্রক্রিয়া দেখায় যা একটি নির্দিষ্ট প্রক্রিয়ার সাথে আবদ্ধ:

Kotlin

val PACKAGE_NAME = "com.example.background.multiprocess"

val serviceName = RemoteWorkerService::class.java.name
val componentName = ComponentName(PACKAGE_NAME, serviceName)

val data: Data = Data.Builder()
   .putString(ARGUMENT_PACKAGE_NAME, componentName.packageName)
   .putString(ARGUMENT_CLASS_NAME, componentName.className)
   .build()

return OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker::class.java)
   .setInputData(data)
   .build()

জাভা

String PACKAGE_NAME = "com.example.background.multiprocess";

String serviceName = RemoteWorkerService.class.getName();
ComponentName componentName = new ComponentName(PACKAGE_NAME, serviceName);

Data data = new Data.Builder()
        .putString(ARGUMENT_PACKAGE_NAME, componentName.getPackageName())
        .putString(ARGUMENT_CLASS_NAME, componentName.getClassName())
        .build();

return new OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker.class)
        .setInputData(data)
        .build();

প্রতিটি RemoteWorkerService-এর জন্য, আপনাকে AndroidManifest.xml ফাইলে পরিষেবার সংজ্ঞা যোগ করতে হবে:

<manifest ... >
    <service
            android:name="androidx.work.multiprocess.RemoteWorkerService"
            android:exported="false"
            android:process=":worker1" />

        <service
            android:name=".RemoteWorkerService2"
            android:exported="false"
            android:process=":worker2" />
    ...
</manifest>