কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েডে চলমান AsyncTask বাতিল করার পদ্ধতি

AsyncTask বাতিল করা (cancel)

AsyncTask ব্যাকগ্রাউন্ডে কাজ করে এবং মেইন থ্রেডে আপডেট দেয়। চলমান AsyncTask বাতিল করতে cancel(true) ব্যবহার করা হয়। এই উদাহরণটি দেখায় কীভাবে এটি বাস্তবায়ন করা যায়।

ধাপ ১: নতুন প্রজেক্ট তৈরি করুন

Android Studio-তে File → New Project-এ যান এবং প্রজেক্ট তৈরি করুন।

ধাপ ২: লেআউট ফাইলে কোড যোগ করুন

res/layout/activity_main.xml ফাইলে নিচের কোড যোগ করুন:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/rootview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#C1C1C1"
    android:gravity="center_horizontal"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/asyncTask"
        android:text="ডাউনলোড"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ImageView
        android:id="@+id/image"
        android:layout_width="300dp"
        android:layout_height="300dp" />
</LinearLayout>

বাটনে ক্লিক করলে ইন্টারনেট থেকে ইমেজ ডাউনলোড করে ImageView-এ দেখাবে।

ধাপ ৩: MainActivity.java-তে কোড যোগ করুন

package com.example.andy.myapplication;

import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    AsyncTaskExample asyncTask;
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button button = findViewById(R.id.asyncTask);
        imageView = findViewById(R.id.image);
        
        button.setOnClickListener(v -> {
            asyncTask = new AsyncTaskExample();
            asyncTask.execute("https://www.tutorialspoint.com/images/tp-logo-diamond.png");
        });
    }

    private class AsyncTaskExample extends AsyncTask {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setMessage("অনুগ্রহ করে অপেক্ষা করুন... ডাউনলোড হচ্ছে");
            progressDialog.setIndeterminate(true);
            progressDialog.setCancelable(true);
            progressDialog.setOnCancelListener(dialog -> {
                asyncTask.cancel(true);
                Toast.makeText(MainActivity.this, "AsyncTask বন্ধ করা হয়েছে", Toast.LENGTH_LONG).show();
            });
            progressDialog.show();
        }

        @Override
        protected Bitmap doInBackground(String... strings) {
            try {
                Thread.sleep(10000); // ১০ সেকেন্ড 윌ম্ব (ডেমো용)
                URL url = new URL(strings[0]);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setDoInput(true);
                conn.connect();
                InputStream is = conn.getInputStream();
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inPreferredConfig = Bitmap.Config.RGB_565;
                return BitmapFactory.decodeStream(is, null, options);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            if (bitmap != null && imageView != null && !isCancelled()) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

বাতিল করার মূল পয়েন্ট:

  • ProgressDialog-এ `setOnCancelListener` সেট করে ব্যবহারকারী ডায়ালগ বাতিল করলে `asyncTask.cancel(true)` কল করা
  • `doInBackground`-এ পর করার আগে `isCancelled()` চেক করা ভালো প্র্যাকটিস
  • `onPostExecute`-এ `isCancelled()` চেক করে UI আপডেট এড়ানো

ধাপ ৪: Manifest-এ ইন্টারনেট পারমিশন যোগ করুন

<uses-permission android:name="android.permission.INTERNET" />

অ্যাপ্লিকেশন চালান

অ্যাপটি চালান। "ডাউনলোড" বাটনে ক্লিক করলে প্রগ্রেস ডায়ালগ দেখাবে। ডায়ালগের বাইরে ক্লিক করলে AsyncTask বাতিল হয়ে যাবে এবং "AsyncTask বন্ধ করা হয়েছে" টোস্ট দেখাবে।

দ্রষ্টব্য: AsyncTask API 30-এ ডিপ্রিকেটেড। আধুনিক অ্যাপে Coroutines, RxJava বা WorkManager ব্যবহার করা উচিত।

  1. Android-এ Stack সর্ট (Sort) করার পদ্ধতি

  2. Android-এ ArrayBlockingQueue খালি করার (clear) পদ্ধতি

  3. অ্যান্ড্রয়েডে AsyncTask থ্রেড বন্ধ করার পদ্ধতি

  4. Android-এ AsyncTask-এর জন্য টাইমআউট সেট করার পদ্ধতি