CoroutineWorker মধ্যে থ্রেডিং

Kotlin ব্যবহারকারীদের জন্য, WorkManager কোরোটিনের জন্য প্রথম-শ্রেণীর সমর্থন প্রদান করে। শুরু করতে, আপনার 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 coroutine বাতিল করে এবং বাতিলকরণ সংকেত প্রচার করে স্টপেজগুলি স্বয়ংক্রিয়ভাবে পরিচালনা করে। কাজের স্টপেজগুলি পরিচালনা করার জন্য আপনাকে বিশেষ কিছু করতে হবে না।

একটি ভিন্ন প্রক্রিয়ায় একটি CoroutineWorker চালানো

এছাড়াও আপনি ListenableWorker এর একটি বাস্তবায়ন RemoteCoroutineWorker ব্যবহার করে একজন কর্মীকে একটি নির্দিষ্ট প্রক্রিয়ার সাথে আবদ্ধ করতে পারেন।

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

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

কোটলিন

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>

নমুনা