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

অ্যান্ড্রয়েডে AsyncTask সমান্তরাল এক্সিকিউশন (Parallel Execution)

অ্যান্ড্রয়েডে একাধিক AsyncTask সমান্তরাল চালানো

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

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

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" />
    <ImageView
        android:id="@+id/image2"
        android:layout_width="300dp"
        android:layout_height="300dp" />
</LinearLayout>

দুইটি ImageView এবং একটি বাটন। বাটনে ক্লিক করলে দুটি ইমেজ সমান্তরাল ডাউনলোড হবে।

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

package com.example.andy.myapplication;

import android.app.ProgressDialog;
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 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, imageView2;
    AsyncTaskExample asyncTask;
    AsyncTaskExample2 asyncTask2;
    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);
        imageView2 = findViewById(R.id.image2);
        
        button.setOnClickListener(v -> {
            asyncTask2 = new AsyncTaskExample2();
            asyncTask2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 
                "https://www.tutorialspoint.com/cprogramming/images/logo.png");
            
            asyncTask = new AsyncTaskExample();
            asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 
                "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(false);
            progressDialog.show();
        }

        @Override
        protected Bitmap doInBackground(String... strings) {
            try {
                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) imageView.setImageBitmap(bitmap);
        }
    }

    private class AsyncTaskExample2 extends AsyncTask {
        @Override
        protected Bitmap doInBackground(String... strings) {
            try {
                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 (bitmap != null && imageView2 != null) imageView2.setImageBitmap(bitmap);
        }
    }
}

সমান্তরাল এক্সিকিউশনের কী:

asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);

ডিফল্টভাবে AsyncTask সিরিয়ালি চলে। THREAD_POOL_EXECUTOR ব্যবহার করে একসাথে বেশি করে ৫টি AsyncTask চলানো যায়।

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

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

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

অ্যাপটি চালান। বাটনে ক্লিক করলে দুটি ইমেজ সমান্তরাল ডাউনলোড শুরু হবে এবং প্রগ্রেস ডায়ালগ দেখাবে। ডাউনলোড শেষ হলে দুটি ইমেজ একসাথে দেখাবে।

দ্রষ্টব্য: AsyncTask API 30-এ ডিপ্রিকেটেড। নতুন প্রজেক্টে Coroutines বা ExecutorService ব্যবহার করুন।

  1. Android-এ unmodifiableSet কীভাবে ব্যবহার করবেন?

  2. Android-এ synchronizedSortedSet কীভাবে ব্যবহার করবেন?

  3. Android-এ synchronizedSet কীভাবে ব্যবহার করবেন?

  4. Android-এ ToggleButton ব্যবহার করার উদাহরণ