ইন্টারমিডিয়েট ওয়ার্কারের প্রোগ্রেস পর্যবেক্ষণ করা

WorkManager-এ কর্মীদের জন্য মধ্যবর্তী অগ্রগতি সেট করা এবং পর্যবেক্ষণ করার জন্য বিল্ট-ইন সহায়তা রয়েছে। অ্যাপটি ফোরগ্রাউন্ডে থাকাকালীন যদি ওয়ার্কারটি রান করে, তাহলে এই তথ্যটি API ব্যবহার করে ব্যবহারকারীকে দেখানো যেতে পারে যা WorkInfo-এর LiveData ফেরত দেয়।

ListenableWorker এখন setProgressAsync() API-তে কাজ করে, যা এটিকে মধ্যবর্তী অগ্রগতি বজায় রাখতে দেয়। এইসব API ডেভেলপারদের ইন্টারমিডিয়েট প্রগ্রেস সেট করার অনুমতি দেয় যা UI-এর মাধ্যমে দেখা যায়। অগ্রগতি Data ধরনের মাধ্যমে দেখানো হয়, যা হল প্রপার্টির সিরিয়ালাইজ করা যায় এমন কন্টেনার (input এবং output-এর মতো, এবং একই বিধিনিষেধের অধীনে)।

ListenableWorker চালু থাকাকালীনই শুধুমাত্র প্রগ্রেস সংক্রান্ত তথ্য দেখা ও আপডেট করা যাবে। ListenableWorker-এ প্রোগ্রেস সেট করার চেষ্টা এটি এক্সিকিউশন সম্পূর্ণ করার পরে উপেক্ষা করা হয়।

এছাড়াও, আপনি getWorkInfoBy…() বা getWorkInfoBy…LiveData() পদ্ধতির মধ্যে কোনও একটি ব্যবহার করে প্রগ্রেস সংক্রান্ত তথ্য দেখতে পারবেন। এইসব পদ্ধতি WorkInfo-এর ইনস্ট্যান্স রিটার্ন করে, যার একটি নতুন getProgress() পদ্ধতি আছে যা Data রিটার্ন করে।

আপডেট প্রোগ্রেস

ListenableWorker বা Worker ব্যবহার করা Java ডেভেলপারদের জন্য, setProgressAsync() API একটি ListenableFuture<Void> রিটার্ন করে; আপডেট করার প্রসেস অ্যাসিঙ্ক্রোনাস, কারণ আপডেট করার প্রসেসে ডেটাবেসে প্রগ্রেস সংক্রান্ত তথ্য সেভ করা হয়। Kotlin-এ, আপনি CoroutineWorker অবজেক্টের setProgress() এক্সটেনশন ফাংশন ব্যবহার করে প্রোগ্রেস সংক্রান্ত তথ্য আপডেট করতে পারবেন।

এই উদাহরণে একটি ProgressWorker দেখানো হয়েছে। Worker শুরু হওয়ার সময় এর প্রগ্রেস 0-তে সেট করে এবং সম্পূর্ণ হওয়ার পরে প্রগ্রেসের মান আপডেট করে 100 করে।

Kotlin

import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.Data
import androidx.work.WorkerParameters
import kotlinx.coroutines.delay

class ProgressWorker(context: Context, parameters: WorkerParameters) :
    CoroutineWorker(context, parameters) {

    companion object {
        const val Progress = "Progress"
        private const val delayDuration = 1L
    }

    override suspend fun doWork(): Result {
        val firstUpdate = workDataOf(Progress to 0)
        val lastUpdate = workDataOf(Progress to 100)
        setProgress(firstUpdate)
        delay(delayDuration)
        setProgress(lastUpdate)
        return Result.success()
    }
}

জাভা

import android.content.Context;
import androidx.annotation.NonNull;
import androidx.work.Data;
import androidx.work.Worker;
import androidx.work.WorkerParameters;

public class ProgressWorker extends Worker {

    private static final String PROGRESS = "PROGRESS";
    private static final long DELAY = 1000L;

    public ProgressWorker(
        @NonNull Context context,
        @NonNull WorkerParameters parameters) {
        super(context, parameters);
        // Set initial progress to 0
        setProgressAsync(new Data.Builder().putInt(PROGRESS, 0).build());
    }

    @NonNull
    @Override
    public Result doWork() {
        try {
            // Doing work.
            Thread.sleep(DELAY);
        } catch (InterruptedException exception) {
            // ... handle exception
        }
        // Set progress to 100 after you are done doing your work.
        setProgressAsync(new Data.Builder().putInt(PROGRESS, 100).build());
        return Result.success();
    }
}

অগ্রগতি লক্ষ্য করুন

অগ্রগতি সংক্রান্ত তথ্য দেখতে, getWorkInfoById পদ্ধতি ব্যবহার করুন এবং WorkInfo-এর রেফারেন্স পান।

এখানে একটি উদাহরণ দেওয়া হল যেখানে Kotlin-এর জন্য getWorkInfoByIdFlow এবং Java-এর জন্য getWorkInfoByIdLiveData ব্যবহার করা হয়েছে।

Kotlin

WorkManager.getInstance(applicationContext)
      // requestId is the WorkRequest id
      .getWorkInfoByIdFlow(requestId)
      .collect { workInfo: WorkInfo? ->
          if (workInfo != null) {
              val progress = workInfo.progress
              val value = progress.getInt("Progress", 0)
              // Do something with progress information
          }
      }

জাভা

WorkManager.getInstance(getApplicationContext())
     // requestId is the WorkRequest id
     .getWorkInfoByIdLiveData(requestId)
     .observe(lifecycleOwner, new Observer<WorkInfo>() {
             @Override
             public void onChanged(@Nullable WorkInfo workInfo) {
                 if (workInfo != null) {
                     Data progress = workInfo.getProgress();
                     int value = progress.getInt(PROGRESS, 0)
                     // Do something with progress
             }
      }
});

বন্ধ করার কারণের অবস্থা পর্যবেক্ষণ করুন

Worker কেন বন্ধ করা হয়েছে তা ডিবাগ করতে, আপনি WorkInfo.getStopReason()-এ কল করে বন্ধ করার কারণ লগ করতে পারবেন:

Kotlin

workManager.getWorkInfoByIdFlow(syncWorker.id)
  .collect { workInfo ->
      if (workInfo != null) {
        val stopReason = workInfo.stopReason
        logStopReason(syncWorker.id, stopReason)
      }
  }

জাভা

  workManager.getWorkInfoByIdLiveData(syncWorker.id)
    .observe(getViewLifecycleOwner(), workInfo -> {
        if (workInfo != null) {
          int stopReason = workInfo.getStopReason();
          logStopReason(syncWorker.id, workInfo.getStopReason());
        }
  });

Worker অবজেক্টের লাইফসাইকেল ও স্ট্যাটাস সম্পর্কে আরও ডকুমেন্টেশনের জন্য, কাজের স্ট্যাটাস পড়ুন।