WorkManager-এ ওয়ার্কারদের অন্তর্বর্তী অগ্রগতি নির্ধারণ ও পর্যবেক্ষণ করার জন্য অন্তর্নির্মিত ব্যবস্থা রয়েছে। অ্যাপটি ফোরগ্রাউন্ডে থাকা অবস্থায় যদি ওয়ার্কারটি চলমান থাকে, তবে WorkInfo এর LiveData রিটার্নকারী API ব্যবহার করে এই তথ্যটিও ব্যবহারকারীকে দেখানো যেতে পারে।
ListenableWorker এখন setProgressAsync() API সমর্থন করে, যা এটিকে মধ্যবর্তী অগ্রগতি সংরক্ষণ করতে দেয়। এই API-গুলো ডেভেলপারদের মধ্যবর্তী অগ্রগতি সেট করার সুযোগ দেয়, যা UI-এর মাধ্যমে পর্যবেক্ষণ করা যায়। অগ্রগতি Data টাইপ দ্বারা উপস্থাপিত হয়, যা প্রোপার্টিগুলোর একটি সিরিয়ালাইজেবল কন্টেইনার ( input এবং output মতো এবং একই সীমাবদ্ধতার অধীন)।
ListenableWorker চলমান থাকা অবস্থাতেই কেবল অগ্রগতির তথ্য পর্যবেক্ষণ ও হালনাগাদ করা যায়। কোনো ListenableWorker কার্য সম্পাদন সম্পন্ন হওয়ার পর তার অগ্রগতি নির্ধারণের প্রচেষ্টা উপেক্ষা করা হয়।
আপনি getWorkInfoBy…() অথবা getWorkInfoBy…LiveData() মেথডগুলোর যেকোনো একটি ব্যবহার করেও অগ্রগতির তথ্য পর্যবেক্ষণ করতে পারেন। এই মেথডগুলো WorkInfo এর ইনস্ট্যান্স রিটার্ন করে, যার একটি নতুন getProgress() মেথড রয়েছে যা Data রিটার্ন করে।
অগ্রগতির হালনাগাদ
যেসব জাভা ডেভেলপার ListenableWorker বা Worker ব্যবহার করেন, তাদের জন্য setProgressAsync() API একটি ListenableFuture<Void> রিটার্ন করে; প্রোগ্রেস আপডেট করা অ্যাসিঙ্ক্রোনাস, কারণ এই আপডেট প্রক্রিয়ায় ডেটাবেসে প্রোগ্রেসের তথ্য সংরক্ষণ করা হয়। কোটলিনে, প্রোগ্রেসের তথ্য আপডেট করার জন্য আপনি CoroutineWorker অবজেক্টের setProgress() এক্সটেনশন ফাংশনটি ব্যবহার করতে পারেন।
এই উদাহরণটি একটি ProgressWorker দেখাচ্ছে। Worker শুরু হওয়ার সময় এর অগ্রগতি ০-তে সেট করে এবং কাজ শেষ হলে অগ্রগতির মান ১০০-তে আপডেট করে।
কোটলিন
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 এর একটি রেফারেন্স নিন।
এখানে একটি উদাহরণ দেওয়া হলো যেখানে কোটলিনের জন্য getWorkInfoByIdFlow এবং জাভার জন্য getWorkInfoByIdLiveData ব্যবহার করা হয়েছে।
কোটলিন
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() কল করে বন্ধ হওয়ার কারণটি লগ করতে পারেন:
কোটলিন
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 অবজেক্টের জীবনচক্র এবং অবস্থা সম্পর্কে আরও তথ্যের জন্য, Work states পড়ুন।