AsyncTask ক্লাস একটি ব্যাকগ্রাউন্ড থ্রেডে কিছু কাজ সম্পাদনের জন্য সহজ রাস্তা প্রদান করে এবং ইউআই থ্রেডে ফলাফল প্রকাশ করে। এটা ব্যবহার করতে, একটি সাবক্লাস তৈরী করুন এবং প্রদত্ত মেথড ওভাররাইড করুন। এখানে AsyncTask এবং decodeSampledBitmapFromResource() ব্যবহার করে একটি ImageView এর মধ্যে একটি বড় আকারের ইমেজ লোড করার উদাহরণ দেয়া হলো:
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int data = 0;
public BitmapWorkerTask(ImageView imageView) {
// Use a WeakReference to ensure the ImageView can be garbage collected
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Decode image in background.
@Override
protected Bitmap doInBackground(Integer... params) {
data = params[0];
return decodeSampledBitmapFromResource(getResources(), data, 100, 100));
}
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
ImageView এর প্রতি WeakReference নিশ্চিত করে যে AsyncTask ImageView কে এবং গারবেজ হওয়া কোন কিছুকে রেফারেন্স করে তা বন্ধ করে না। এটার কোন নিশ্চয়তা নেই যখন কাজ শেষ হবে তখনও আশেপাশে ImageView থাকবে, তাই আপনাকে অবশ্যই onPostExecute()এর মধ্যে রেফারেন্স চেক করতে হবে। ImageView এর অস্তিত্ব আর নাও থাকতে পারে, যদি উদাহরণস্বরূপ, একটিভিটি থেকে নেভিগেট করে চলে যায় বা যদি কাজ শেষ হওয়ার পূর্বেই কনফিগারেশনের পরিবর্তন ঘটে থাকে
বিটম্যাপ আসিংক্রোনাসলি (asynchronously) লোড শুরু করতে চাইলে, শুধু নতুন কাজ তৈরী করুন এবং সম্পাদন করুন:
public void loadBitmap(int resId, ImageView imageView) {
BitmapWorkerTask task = new BitmapWorkerTask(imageView);
task.execute(resId);
}