অ্যাসিঙ্কটাস্ক অ্যান্ড্রয়েড উদাহরণ


680

আমি পড়ছিলাম AsyncTask, এবং আমি নীচের সহজ প্রোগ্রামটি চেষ্টা করেছিলাম। তবে তাতে কাজ হবে বলে মনে হয় না। আমি কীভাবে এটি কাজ করতে পারি?

public class AsyncTaskActivity extends Activity {

    Button btn;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener((OnClickListener) this);
    }

    public void onClick(View view){
        new LongOperation().execute("");
    }

    private class LongOperation extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            for(int i=0;i<5;i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("Executed");
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }
}

আমি ব্যাকগ্রাউন্ড প্রক্রিয়াতে 5 সেকেন্ড পরে কেবল লেবেলটি পরিবর্তন করার চেষ্টা করছি।

এটি আমার প্রধান। এক্সএমএল :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical" >
    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:indeterminate="false"
        android:max="10"
        android:padding="10dip">
    </ProgressBar>
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Progress" >
    </Button>
    <TextView android:id="@+id/output"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Replace"/>
</LinearLayout>

1
এছাড়াও আপনি ডইনব্যাকগ্রাউন্ড () পদ্ধতি থেকে পাবলিকেশনগ্রোগ্রেস () কল করে অগ্রগতিটি প্রদর্শন করতে পারেন।
ওসুম

3
এখানে অ্যাসিঙ্কটাস উদাহরণ অ্যাসিঙ্কটাসকের উদাহরণ
সমীর মঙ্গরোলিয়া

: এখানে খুব ইমেজ ডাউনলোড করার একটি asynctask উদাহরণ android-ios-tutorials.com/182/...
Houcine

AsyncTask - ডিজাইন প্যাটার্ন: stackoverflow.com/questions/5058661/...
HenryChuang

3
সাধারণ উদাহরণ ... আপনাকে অবশ্যই লিঙ্কটি
c49

উত্তর:


702

ঠিক আছে, আপনি অন্য থ্রেডের মাধ্যমে জিইউআই অ্যাক্সেস করার চেষ্টা করছেন। এটি মূলত ভাল অনুশীলন নয়।

অ্যাসিঙ্কটাস্ক doInBackground()অন্য থ্রেডের অভ্যন্তরে সমস্ত কিছু সম্পাদন করে , যেখানে জিওআইতে আপনার দর্শন রয়েছে সেখানে অ্যাক্সেস নেই।

preExecute()এবং postExecute()এই নতুন থ্রেডে ভারী উত্তোলনের আগে এবং পরে আপনাকে জিইউতে অ্যাক্সেস দেওয়ার প্রস্তাব দেয় এবং postExecute()প্রসেসিংয়ের কোনও ফলাফল দেখানোর জন্য আপনি দীর্ঘ অপারেশনের ফলাফলও পাস করতে পারেন ।

এই লাইনগুলি দেখুন যেখানে আপনি পরে আপনার টেক্সটভিউ আপডেট করছেন:

TextView txt = findViewById(R.id.output);
txt.setText("Executed");

তাদের ভিতরে রাখুন onPostExecute()

তারপরে আপনি doInBackgroundসম্পূর্ণ হবার পরে আপনার টেক্সটভিউ পাঠ্যটি আপডেট হবে ।

আমি লক্ষ্য করেছি যে আপনার অনক্লিক শ্রোতা কোন ভিউ নির্বাচন করেছেন তা পরীক্ষা করে না। আমি এটি করার সবচেয়ে সহজ উপায়টি হ'ল স্যুইচ স্টেটমেন্ট via বিভ্রান্তি বাঁচাতে আমার সমস্ত পরামর্শ সহ নীচে সম্পাদিত একটি সম্পূর্ণ শ্রেণি রয়েছে।

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings.System;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;

public class AsyncTaskActivity extends Activity implements OnClickListener {

    Button btn;
    AsyncTask<?, ?, ?> runningTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = findViewById(R.id.button1);

        // Because we implement OnClickListener, we only
        // have to pass "this" (much easier)
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        // Detect the view that was "clicked"
        switch (view.getId()) {
        case R.id.button1:
            if (runningTask != null)
                runningTask.cancel(true);
            runningTask = new LongOperation();
            runningTask.execute();
            break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Cancel running task(s) to avoid memory leaks
        if (runningTask != null)
            runningTask.cancel(true);
    }

    private final class LongOperation extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... params) {
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // We were cancelled; stop sleeping!
                }
            }
            return "Executed";
        }

        @Override
        protected void onPostExecute(String result) {
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("Executed"); // txt.setText(result);
            // You might want to change "executed" for the returned string
            // passed into onPostExecute(), but that is up to you
        }
    }
}

2
আমি এই <কোড> বিটিএন.সেটঅনক্লিকলিস্টার (এটি) করতে অক্ষম; </code> Eclipse একটি ত্রুটি দেয় ----- "ভিউ টাইপ-এ পদ্ধতি সেটঅনক্লিকলিস্টার (View.OnClickListener) আর্গুমেন্টের জন্য প্রযোজ্য নয় (AsyncTaskActivity)"
ফক্স

আমি পাঠ্যের সেটিংটি স্থিতিশীল না করে পরিবর্তনের onPostExecute(String result)পদ্ধতিটি থেকে পরামর্শ নেওয়ার পরামর্শ দেব । এটি ভবিষ্যতের পাঠকদের জন্য আরও স্পষ্ট করে তুলবে যে আর্গুমেন্টটির রিটার্ন ভ্যালু দ্বারা জনপ্রিয় doInBackground(String... params)
এরিক

@ এরিক টোবিয়াস - ইতিমধ্যে মন্তব্য করা বিভাগে সেই সঠিক কাজগুলি হয়েছে। আমি আমার সম্পূর্ণ উদাহরণে ব্যবহারকারীদের প্রশ্নের অনুসরণ ও উত্তর দিচ্ছিলাম।
গ্রাহাম স্মিথ 21

1
সংযোজন এবং গুগল সিডার হিসাবে (এবং বর্তমানে এই জিনিসটি শিখার কারও কাছ থেকে আগত আমি কীভাবে এসেছি): বেশিরভাগ ইউআই আপডেট আপনি এমন কিছু করতে পারবেন যেখানে আপনাকে ব্যবহারকারীকে ফিরে রিপোর্ট করা উচিত যেখানে প্রগ্রেসআপটেড কল ফিরে আসে যা মূল ইউআই থ্রেডে কার্যকর করা হয়।
রিচিএইচএইচ

1
আপনার কার্যকলাপ যদি কোনও কারণে ঘোরানো হয় বা ধ্বংস হয়ে যায় তবে অবশ্যই এই জগাখিচুড়ি হবে ...
স্যাম

792

আমার পুরো উত্তরটি এখানে , তবে এই পৃষ্ঠায় অন্যান্য উত্তরগুলির পরিপূরক করতে এখানে একটি ব্যাখ্যামূলক চিত্র রয়েছে। আমার জন্য, সমস্ত ভেরিয়েবলগুলি কোথায় গিয়েছিল তা বোঝা শুরুতে সবচেয়ে বিভ্রান্তিকর অংশ ছিল।

এখানে চিত্র বর্ণনা লিখুন


3
paramsএকটি অ্যারে হয়। (উপরের উদাহরণে এটি একটি Stringঅ্যারে ছিল )) এটি আপনাকে একই ধরণের একাধিক পরামিতিগুলিতে যেতে দেয়। তারপর আপনি যাদের পরামিতি অ্যাক্সেস করতে পারেন params[0], params[1], params[2]উদাহরণে, ইত্যাদি, সেখানে শুধুমাত্র একটি একক ছিল Stringমধ্যে paramsঅ্যারে। আপনার যদি বিভিন্ন ধরণের একাধিক পরামিতিগুলিতে পাস করার প্রয়োজন হয় (উদাহরণস্বরূপ, একটি Stringএবং একটি int), এই প্রশ্নটি দেখুন
সুরগাচ

73

আমি নিশ্চিত এটি সঠিকভাবে কার্যকর হচ্ছে, তবে আপনি পটভূমির থ্রেডে ইউআই উপাদানগুলি পরিবর্তন করার চেষ্টা করছেন এবং এটি হবে না।

আপনার কল এবং AsyncTask নীচে হিসাবে সংশোধন করুন:

কলিং ক্লাস

দ্রষ্টব্য: আমি ব্যক্তিগতভাবে onPostExecute()আপনি যেখানে আপনার অ্যাসিঙ্কটাস্ক থ্রেডটি কার্যকর করেন সেখানেই ব্যবহার করার পরামর্শ দিই এবং অ্যাসিঙ্কটাস্ক নিজেই প্রসারিত ক্লাসে নয়। আমি মনে করি কোড পড়তে আরও সহজ করে তোলে বিশেষত আপনার যদি একাধিক জায়গায় অ্যাসিঙ্কটাস্কের প্রয়োজন হয় ফলাফলগুলি সামান্য ভিন্নভাবে পরিচালনা করতে।

new LongThread() {
    @Override public void onPostExecute(String result) {
        TextView txt = (TextView) findViewById(R.id.output);
        txt.setText(result);
    }
}.execute("");

লংথ্রেড ক্লাস (অ্যাসিঙ্কটাস্ক প্রসারিত):

@Override
protected String doInBackground(String... params) {
    for (int i = 0; i < 5; i++) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    return "Executed";
}      

7
ক্রিয়াকলাপ থেকে অ্যাসিঙ্কটাসকে ডুপ্লাস করে এমন একটি উদাহরণ সরবরাহ করার জন্য ধন্যবাদ
অগস্ট

1
হ্যাঁ, অবশেষে কেউ টাস্ক এবং ক্রিয়াকলাপটিকে ডিউপল করে। আপনাকে ধন্যবাদ। onPostExecuteএবং ক্রিয়াকলাপটি ওভাররাইড করা উজ্জ্বল।
mcy

58

ধারণা এবং কোড এখানে

অ্যান্ড্রয়েডের অ্যাসিঙ্কটাস্ক ব্যবহারের জন্য আমি একটি সাধারণ উদাহরণ তৈরি করেছি। এটি শুরু হয় onPreExecute(), doInBackground(), publishProgress()এবং শেষ পর্যন্ত onProgressUpdate()

এটিতে doInBackground () ব্যাকগ্রাউন্ড থ্রেড হিসাবে কাজ করে, অন্যদিকে ইউআই থ্রেডে কাজ করে। আপনি doInBackground () এর কোনও UI উপাদান অ্যাক্সেস করতে পারবেন না। ক্রমটি আমি যেমন বলেছি তেমনই।

তবে আপনার যদি কোনও উইজেট আপডেট করতে হয় তবে আপনি যা doInBackgroundকরতে পারেন তা publishProgressথেকে আপনার ইউআই উইজেট আপডেট doInBackgroundকরতে কল করতে পারেন onProgressUpdate

class TestAsync extends AsyncTask<Void, Integer, String> {
    String TAG = getClass().getSimpleName();

    protected void onPreExecute() {
        super.onPreExecute();
        Log.d(TAG + " PreExceute","On pre Exceute......");
    }

    protected String doInBackground(Void...arg0) {
        Log.d(TAG + " DoINBackGround", "On doInBackground...");

        for (int i=0; i<10; i++){
            Integer in = new Integer(i);
            publishProgress(i);
        }
        return "You are at PostExecute";
    }

    protected void onProgressUpdate(Integer...a) {
        super.onProgressUpdate(a);
        Log.d(TAG + " onProgressUpdate", "You are in progress update ... " + a[0]);
    }

    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.d(TAG + " onPostExecute", "" + result);
    }
}

আপনার ক্রিয়াকলাপে এটি এটিকে কল করুন:

new TestAsync().execute();

বিকাশকারী রেফারেন্স এখানে


3
জাভাতে সাধারণত মূল অক্ষরের সাথে ক্লাস শুরু হয়, এটি একটি স্বরলিপি সাধারণত অনুসরণ করা হয়
বংশী পবন মহেশ

20

এই দুটি লাইন সরান:

TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");

আপনার অ্যাসিঙ্কটাস্কের doInBackgroundপদ্ধতিটি বাদ দিয়ে এগুলি onPostExecuteপদ্ধতিতে রেখে দিন। আপনার AsyncTaskকিছু দেখতে হবে:

private class LongOperation extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        try {
            Thread.sleep(5000); // no need for a loop
        } catch (InterruptedException e) {
            Log.e("LongOperation", "Interrupted", e);
            return "Interrupted";
        }
        return "Executed";
    }      

    @Override
    protected void onPostExecute(String result) {               
        TextView txt = (TextView) findViewById(R.id.output);
        txt.setText(result);
    }
}

আরে আমি কী পরিষেবাতে async টাস্ক চালাচ্ছি আমি কিছুটা মূল ইউ থ্রেডে ফিরিয়ে দিতে চাই।
Dipen

@ ডিপেন - এই আলোচনাটি দেখুন । দুটি বিষয় রয়েছে: একটি থেকে ফলাফলের প্রতিবেদন করা AsyncTask, যা আমার উত্তরটি সম্বোধন করে; এবং ইউআই থ্রেডে কোনও পরিষেবা থেকে একটি মান প্রেরণ, যা অন্য আলোচনার ঠিকানা দেয়। এই বিষয়গুলি স্বাধীন।
টেড হপ

14

পটভূমি / তত্ত্ব

ইউআই থ্রেডে ফলাফল প্রকাশের সময় অ্যাসিঙ্কটাস্ক আপনাকে পটভূমি থ্রেডে কোনও কাজ চালানোর অনুমতি দেয়।

ব্যবহারকারীর সর্বদা অ্যাপের সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হওয়া উচিত তাই ওয়েব থেকে সামগ্রী ডাউনলোড করার মতো কাজগুলির সাথে মূল (ইউআই) থ্রেডটি ব্লক করা এড়ানো গুরুত্বপূর্ণ

এজন্য আমরা একটি ব্যবহার করি AsyncTask

এটি ইউআই থ্রেড বার্তা সারি এবং হ্যান্ডলারের মোড়ক দিয়ে একটি সরল ইন্টারফেস দেয় যা আপনাকে অন্য থ্রেড থেকে চালানোযোগ্য বস্তু এবং বার্তাগুলি প্রেরণ এবং প্রক্রিয়া করার অনুমতি দেয়

বাস্তবায়ন

অ্যাসিঙ্কটাস্ক একটি জেনেরিক ক্লাস। (এটি তার নির্মাত্রে প্যারামিটারাইজড প্রকারগুলি নেয় ))

এটি এই তিনটি জেনেরিক ধরণের ব্যবহার করে :

Params - কার্যকর করার পরে টাস্কে পাঠানো পরামিতিগুলির ধরণ।

Progress - প্রেক্ষাপট গণনার সময় প্রকাশিত অগ্রগতির ইউনিটগুলির ধরণ।

Result - পটভূমি গণনার ফলাফলের ধরণ।

সবসময় সবসময় একটি অ্যাসিক্রোনাস টাস্ক দ্বারা ব্যবহৃত হয় না। কোনও প্রকারকে অব্যবহৃত হিসাবে চিহ্নিত করতে কেবল অকার্যকর টাইপটি ব্যবহার করুন:

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

এই তিনটি পরামিতি তিনটি প্রাথমিক ফাংশনের সাথে সমান যা আপনি ওভাররাইড করতে পারেন AsyncTask:

  • doInBackground(Params...)
  • onProgressUpdate(Progress...)
  • onPostExecute(Result)

অ্যাসিঙ্কটাস্ক কার্যকর করা

  • execute()প্যারামিটারের সাথে কল করুন ব্যাকগ্রাউন্ড টাস্কে প্রেরণ করা হবে।

কি ঘটেছে

  1. উপর প্রধান / ইউআই থ্রেড , onPreExecute()বলা হয়।

    • এই থ্রেডে কিছু শুরু করার জন্য। (যেমন ব্যবহারকারী ইন্টারফেসে একটি অগ্রগতি বার দেখায়))
  2. একটি পটভূমি থ্রেড , doInBackground(Params...)বলা হয়।

    • ( Paramsদিয়ে গেছে execute।)
    • যেখানে দীর্ঘমেয়াদী কাজটি হওয়া উচিত।
    • doInBackground()অ্যাসিঙ্কটাস্ক ব্যবহার করতে কমপক্ষে ওভাররাইড করতে হবে।

    • প্রেক্ষাপটের publishProgress(Progress...)প্রদর্শন (যেমন ইউআই অ্যানিমেশন বা লগ পাঠ্য মুদ্রিত) সহ ইউজার ইন্টারফেস আপডেট করার জন্য কল করুন যখন পটভূমি গণনা এখনও কার্যকর হয়।

      • onProgressUpdate()ডেকে আনার কারণ ।
  3. উপর পটভূমি থ্রেড ফলে থেকে ফিরিয়ে দেওয়া হয় doInBackground()

    • (এটি পরবর্তী পদক্ষেপটি ট্রিগার করে))
  4. উপর প্রধান / ইউআই থ্রেড , onPostExecute()ফিরে ফলাফল নিয়ে বলা হয়।

উদাহরণ

উভয় উদাহরণে "ব্লকিং টাস্ক" ওয়েব থেকে ডাউনলোড।

  • উদাহরণ একটি চিত্র একটি চিত্র ডাউনলোড করে এবং কিছুক্ষণের মধ্যে একটি চিত্র ভিউতে প্রদর্শন করে
  • উদাহরণ বি কিছু ফাইল ডাউনলোড করে

উদাহরণ এ

doInBackground()পদ্ধতি টাইপ বিটম্যাপ একটি অবজেক্ট ইমেজ এবং এটি দোকানে ডাউনলোড করে। onPostExecute()পদ্ধতি বিটম্যাপ নেয় এবং ImageView মধ্যে এটি স্থান।

class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bitImage;

    public DownloadImageTask(ImageView bitImage) {
        this.bitImage = bitImage;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mBmp = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mBmp = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mBmp;
    }

    protected void onPostExecute(Bitmap result) {
        bitImage.setImageBitmap(result);
    }
}

উদাহরণ খ

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

উদাহরণস্বরূপ খ কার্যকর করা

new DownloadFilesTask().execute(url1, url2, url3);

খুব সুন্দর .. তবে আমি রিটার্ন টাইপের সংঘর্ষ সম্পর্কে ত্রুটি পেতে থাকি - বেমানান রিটার্ন টাইপ ব্যবহার করার চেষ্টা করে। আমি সব ধরণের রিটার্নের ধরণের চেষ্টা করেছি, একই ত্রুটি।
জন কেটজিক

হাই @ জোহঙ্কটেকিক, আপনি যে নির্দিষ্ট সমস্যার জন্য সন্ধান করতে পারেন। আপনার সাথে সম্ভবত এটিই ঘটছে: রিটার্ন-টাইপ-হ'ল অ্যাসিঙ্কটাস্ক-এর সাথে বেমানান
টিটি--

1
অসাধারণ! যাচ্ছে বিবেচনা মধ্যে সম্পাদনা ?
পিটার মর্টেনসেন

12

যখন একটি অ্যাসিঙ্ক্রোনাস টাস্ক কার্যকর করা হয়, কাজটি চারটি ধাপের মধ্য দিয়ে যায়:

  1. onPreExecute ()
  2. doInBackground (প্যারাম ...)
  3. onProgressUpdate (প্রগতি ...)
  4. onPostExecute (ফল)

নীচে একটি ডেমো উদাহরণ দেওয়া আছে:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {

    protected Long doInBackground(URL... urls) {
        int count = urls.length;
        long totalSize = 0;
        for (int i = 0; i < count; i++) {
            totalSize += Downloader.downloadFile(urls[i]);
            publishProgress((int) ((i / (float) count) * 100));

            // Escape early if cancel() is called
            if (isCancelled())
                break;
        }
        return totalSize;
    }

    protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
    }

    protected void onPostExecute(Long result) {
        showDialog("Downloaded " + result + " bytes");
    }
 }

এবং একবার আপনি তৈরি করার পরে, কোনও কাজ খুব সহজভাবে সম্পাদন করা হয়:

new DownloadFilesTask().execute(url1, url2, url3);

চালনাযোগ্য হিসাবে প্যারামিটার প্রত্যাশা করে। এটি স্ট্রিং গ্রহণ করে না। আপনার ইউআরএল এর প্রকার কি? স্ট্রিং বা না

10

সবেচেয়ে কিছু করার জন্য সবচেয়ে সংক্ষিপ্ত উদাহরণ:

class MyAsyncTask extends android.os.AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        // Do something asynchronously
        return null;
    }
}

এটি চালানোর জন্য:

(new MyAsyncTask()).execute();

10

AsyncTask এ ব্যবহৃত প্যারামিটারগুলি কীভাবে মুখস্থ করবেন?

না

আপনি যদি অ্যাসিঙ্কটাস্কে নতুন হন তবে অ্যাসিঙ্কটাস্ক লেখার সময় বিভ্রান্ত হওয়া খুব সাধারণ বিষয়। মূল অপরাধীরা হ'ল অ্যাসিঙ্কটাস্কে ব্যবহৃত প্যারামিটারগুলি, অর্থাত্‍ AsyncTask<A, B, C>,। উপর ভিত্তি করে এ, বি, সি (আর্গুমেন্ট) যা কিছু আরও বেশি বিভ্রান্তিকর তোলে পদ্ধতি পৃথক স্বাক্ষর।

সহজবোধ্য রাখো!

চাবিকাঠি মুখস্থ না । যদি আপনি নিজের কার্যটি কী করতে চান তা ভিজ্যুয়ালাইজ করতে পারেন তবে প্রথম প্রচেষ্টাতে সঠিক স্বাক্ষর সহ অ্যাসিঙ্কটাস্ক লেখা একটি কেকের অংশ হবে। শুধু জিনিসটা কি Input, Progressএবং Outputআছে, এবং আপনি যেতে ভাল হতে হবে।

তাহলে অ্যাসিঙ্কটাস্ক কী?

অ্যাসিঙ্কটাস্ক একটি ব্যাকগ্রাউন্ড টাস্ক যা ব্যাকগ্রাউন্ড থ্রেডে চলে। এটি একটি নেয় Input, সম্পাদন করে Progressএবং দেয় Output

অর্থাত , AsyncTask<Input, Progress, Output>

উদাহরণ স্বরূপ:

এখানে চিত্র বিবরণ লিখুন

পদ্ধতির সাথে কী সম্পর্ক?

এর মধ্যে AsyncTaskএবংdoInBackground()

এখানে চিত্র বিবরণ লিখুন

doInBackground()এবং onPostExecute(),onProgressUpdate () `এছাড়াও সম্পর্কিত

এখানে চিত্র বিবরণ লিখুন

কিভাবে কোড লিখবেন?

DownloadTask extends AsyncTask<String, Integer, String>{

    // Always same signature
    @Override
    public void onPreExecute()
    {}

    @Override
    public String doInbackGround(String... parameters)
    {
        // Download code
        int downloadPerc = // Calculate that
        publish(downloadPerc);

        return "Download Success";
    }

    @Override
    public void onPostExecute(String result)
    {
        super.onPostExecute(result);
    }

    @Override
    public void onProgressUpdate(Integer... parameters)
    {
        // Show in spinner, and access UI elements
    }

}

কীভাবে আপনি এই টাস্কটি চালাবেন?

new DownLoadTask().execute("Paradise.mp3");

6

আপনি যখন কর্মী থ্রেডে থাকবেন, আপনি Android এ সরাসরি ইউআই উপাদানগুলি পরিচালনা করতে পারবেন না।

আপনি যখন অ্যাসিঙ্কটাস্ক ব্যবহার করছেন তখন দয়া করে কলব্যাকের পদ্ধতিগুলি বুঝতে পারেন।

উদাহরণ স্বরূপ:

public class MyAyncTask extends AsyncTask<Void, Void, Void>{

    @Override
    protected void onPreExecute() {
        // Here you can show progress bar or something on the similar lines.
        // Since you are in a UI thread here.
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        // After completing execution of given task, control will return here.
        // Hence if you want to populate UI elements with fetched data, do it here.
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
        // You can track you progress update here
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Here you are in the worker thread and you are not allowed to access UI thread from here.
        // Here you can perform network operations or any heavy operations you want.
        return null;
    }
}

এফওয়াইআই: কোনও কর্মী থ্রেড থেকে ইউআই থ্রেড অ্যাক্সেস করতে আপনি হয় রানওনউইথ্রেড () পদ্ধতি বা আপনার পদ্ধতিতে পোস্ট পদ্ধতি ব্যবহার করেন।

এই ক্ষেত্রে:

runOnUiThread(new Runnable() {
    textView.setText("something.");
});

or
    yourview.post(new Runnable() {
    yourview.setText("something");
});

এটি আপনাকে জিনিসগুলি আরও ভালভাবে জানতে সহায়তা করবে। অতএব আপনার ক্ষেত্রে আপনার পোস্টপেক্সেক্সট () পদ্ধতিতে আপনার পাঠ্যদর্শনটি সেট করা দরকার।


5

আমি এই লাইব্রেরিটি ব্যাকগ্রাউন্ড কাজের জন্য ব্যবহার করে আপনার জীবনকে আরও সহজ করার পরামর্শ দিচ্ছি:

https://github.com/Arasthel/AsyncJobLibrary

এটা সহজ ...

AsyncJob.doInBackground(new AsyncJob.OnBackgroundJob() {

    @Override
    public void doOnBackground() {
        startRecording();
    }
});

3

পোস্ট অনুরোধ সহ নমুনা অ্যাসিঙ্ক টাস্ক:

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("key1", "value1"));
params.add(new BasicNameValuePair("key1", "value2"));
new WEBSERVICEREQUESTOR(URL, params).execute();

class WEBSERVICEREQUESTOR extends AsyncTask<String, Integer, String>
{
    String URL;
    List<NameValuePair> parameters;

    private ProgressDialog pDialog;

    public WEBSERVICEREQUESTOR(String url, List<NameValuePair> params)
    {
        this.URL = url;
        this.parameters = params;
    }

    @Override
    protected void onPreExecute()
    {
        pDialog = new ProgressDialog(LoginActivity.this);
        pDialog.setMessage("Processing Request...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params)
    {
        try
        {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpEntity httpEntity = null;
            HttpResponse httpResponse = null;

            HttpPost httpPost = new HttpPost(URL);

            if (parameters != null)
            {
                httpPost.setEntity(new UrlEncodedFormEntity(parameters));
            }
            httpResponse = httpClient.execute(httpPost);

            httpEntity = httpResponse.getEntity();
            return EntityUtils.toString(httpEntity);

        }  catch (Exception e)
        {

        }
        return "";
    }

    @Override
    protected void onPostExecute(String result)
    {
        pDialog.dismiss();

        try
        {

        }
        catch (Exception e)
        {

        }
        super.onPostExecute(result);
    }
}


1

আপনি ক্লিক করতে হবে বোতাম অনক্লিক্লিস্টনার। একবার ক্লিক করা হলে, এটি AsyncTask বর্গ ডাউনলোড জসন কল করে।

প্রক্রিয়াটি নীচে প্রদর্শিত হবে:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btn = (Button) findViewById(R.id.button1);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DownloadJson().execute();
            }
        });
    }

    // DownloadJSON AsyncTask
    private class DownloadJson extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            newlist = new ArrayList<HashMap<String, String>>();
            json = jsonParser.makeHttpRequest(json, "POST");
            try {
                newarray = new JSONArray(json);
                    for (int i = 0; i < countdisplay; i++) {
                        HashMap<String, String> eachnew = new HashMap<String, String>();
                        newobject = newarray.getJSONObject(i);
                        eachnew.put("id", newobject.getString("ID"));
                        eachnew.put("name", newobject.getString("Name"));
                        newlist.add(eachnew);
                    }
                }
            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void args) {
            newlisttemp.addAll(newlist);
            NewAdapterpager newadapterpager = new NewAdapterpager(ProcesssActivitypager.this, newlisttemp);
            newpager.setAdapter(newadapterpager);
        }
    }

1
private class AsyncTaskDemo extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(false);
        progressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... arg0) {

        // Do code here

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }

    @Override
    protected void onCancelled() {

        super.onCancelled();
        progressDialog.dismiss();
        Toast toast = Toast.makeText(
                          getActivity(),
                          "An error is occurred due to some problem",
                          Toast.LENGTH_LONG);
        toast.setGravity(Gravity.TOP, 25, 400);
        toast.show();
    }

}

1

আপডেট: মার্চ 2020

অ্যান্ড্রয়েড বিকাশকারী অফিসিয়াল ডকুমেন্টেশন অনুসারে , অ্যাসিঙ্কটাসকে এখন অবহেলা করা হয়েছে।

পরিবর্তে কোটলিন করুরিইন ব্যবহার করার পরামর্শ দেওয়া হচ্ছে । সহজভাবে, এটি আপনাকে অনুক্রমিক স্টাইলে অ্যাসিঙ্ক্রোনাস টাস্কগুলি লেখার অনুমতি দেয়।


0

অগ্রগতি সহ নমুনা অ্যাসিঙ্কটাস্ক

import android.animation.ObjectAnimator;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class AsyncTaskActivity extends AppCompatActivity implements View.OnClickListener {

    Button btn;
    ProgressBar progressBar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(this);
        progressBar = (ProgressBar)findViewById(R.id.pbar);
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button1:
                new LongOperation().execute("");
                break;
        }
    }

    private class LongOperation extends AsyncTask<String, Integer, String> {

        @Override
        protected String doInBackground(String... params) {
            Log.d("AsyncTask", "doInBackground");
            for (int i = 0; i < 5; i++) {
                try {
                    Log.d("AsyncTask", "task "+(i + 1));
                    publishProgress(i + 1);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.interrupted();
                }
            }
            return "Completed";
        }

        @Override
        protected void onPostExecute(String result) {
            Log.d("AsyncTask", "onPostExecute");
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText(result);
            progressBar.setProgress(0);
        }

        @Override
        protected void onPreExecute() {
            Log.d("AsyncTask", "onPreExecute");
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("onPreExecute");
            progressBar.setMax(500);
            progressBar.setProgress(0);
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            Log.d("AsyncTask", "onProgressUpdate "+values[0]);
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("onProgressUpdate "+values[0]);

            ObjectAnimator animation = ObjectAnimator.ofInt(progressBar, "progress", 100 * values[0]);
            animation.setDuration(1000);
            animation.setInterpolator(new LinearInterpolator());
            animation.start();
        }
    }
}

0

ASync টাস্ক;

public class MainActivity extends AppCompatActivity {

    private String ApiUrl = "your_api";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyTask myTask = new MyTask();
        try {
            String result=myTask.execute(ApiUrl).get();
            Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
           e.printStackTrace();
        }
    }

    public class MyTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... strings) {

            String result = "";
            HttpURLConnection httpURLConnection = null;
            URL url;

            try {
                url = new URL(strings[0]);
                httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                InputStreamReader reader = new InputStreamReader(inputStream);
                result = getData(reader);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return result;
        }

        public String getData(InputStreamReader reader) throws IOException {

            String result = "";
            int data = reader.read();
            while (data!=-1) {
                char now = (char) data;
                result += data;
                data = reader.read();
            }
            return result;
        }
    }

}

ক্লাসের MyTaskভিতরে ক্লাস কেন MainActivity? এটা কি প্রথাগত?
পিটার মর্টেনসেন

0

অ্যাসিঙ্কটাস্কের সাথে কাজ করার সময়, একটি শ্রেণি-উত্তরসূরি তৈরি করা প্রয়োজন এবং এটিতে আমাদের প্রয়োজনীয় পদ্ধতির প্রয়োগের নিবন্ধকরণ করতে। এই পাঠে আমরা তিনটি পদ্ধতির দিকে নজর দেব:

doInBackground - একটি নতুন থ্রেডে কার্যকর করা হবে এবং এখানে আমরা আমাদের সমস্ত কঠিন কাজগুলি সমাধান করি। কারণ একটি প্রাথমিক-প্রাথমিক থ্রেডের ইউআইতে অ্যাক্সেস নেই।

onPreExecute - doInBackground এর আগে মৃত্যুদন্ড কার্যকর করা হয়েছিল এবং ইউআইতে অ্যাক্সেস রয়েছে

onPostExecute - doInBackground এর পরে মৃত্যুদন্ড কার্যকর করা হয়েছে (AsyncTask বাতিল করা হলে কাজ করে না - পরবর্তী পাঠগুলিতে এটি সম্পর্কে) এবং ইউআইতে অ্যাক্সেস রয়েছে।

এটি MyAsyncTask শ্রেণি:

class MyAsyncTask extends AsyncTask<Void, Void, Void> {

  @Override
  protected void onPreExecute() {
    super.onPreExecute();
    tvInfo.setText("Start");
  }

  @Override
  protected Void doInBackground(Void... params) {
    // Your background method
    return null;
  }

  @Override
  protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    tvInfo.setText("Finish");
  }
}

এবং এইভাবে আপনার ক্রিয়াকলাপ বা টুকরোটিতে কল করতে হবে:

MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();

"পরবর্তী পাঠগুলিতে এটি সম্পর্কে" পুনরায় : এটি কী বোঝায়? উদাহরণস্বরূপ, এটি কোথা থেকে নেওয়া হয়েছে?
পিটার মর্টেনসেন

0

আপনি যদি অ্যাসিঙ্কটাস্ক ক্লাসটি খুলেন তবে নীচের কোডটি দেখতে পারেন।

public abstract class AsyncTask<Params, Progress, Result> {
    @WorkerThread
    protected abstract Result doInBackground(Params... params);
    @MainThread
    protected void onPreExecute() {
    }
    @SuppressWarnings({"UnusedDeclaration"})
    @MainThread
    protected void onPostExecute(Result result) {
    }
}

অ্যাসিঙ্কটাস্ক বৈশিষ্ট্য

  1. অ্যাসিঙ্কটাস্ক বিমূর্ত শ্রেণি
  2. অ্যাসিঙ্কটাস্কে 3 জেনেরিক প্যারাম রয়েছে।
  3. অ্যাসিঙ্কটাস্কে doInBackground, onPreExecute, onPostExecute এর বিমূর্ত পদ্ধতি রয়েছে
  4. doInBackground হ'ল ওয়ার্কারথ্রেড (আপনি ইউআই আপডেট করতে পারবেন না)
  5. onPreExecute হ'ল মেইনথ্রেড
  6. onPostExecute হ'ল মেইনথ্রেড (আপনি ইউআই আপডেট করতে পারবেন)

উদাহরণ

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    mEmailView = (AutoCompleteTextView) findViewById(R.id.email);

    AsyncTask<Void, Void, Post> asyncTask = new AsyncTask<Void, Void, Post>() {
        @Override
        protected Post doInBackground(Void... params) {
            try {
                ApiClient defaultClient = Configuration.getDefaultApiClient();
                String authorization = "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE1ODIxMzM4MTB9.bA3Byc_SuB6jzqUGAY4Pyt4oBNg0VfDRctZ8-PcPlYg"; // String | JWT token for Authorization
                ApiKeyAuth Bearer = (ApiKeyAuth) defaultClient.getAuthentication("Bearer");
                Bearer.setApiKey(authorization);
                PostApi apiInstance = new PostApi();
                String id = "1"; // String | id
                Integer commentPage = 1; // Integer | Page number for Comment
                Integer commentPer = 10; // Integer | Per page number For Comment
                Post result;
                try {
                    result = apiInstance.apiV1PostsIdGet(id, authorization, commentPage, commentPer);
                } catch (ApiException e) {
                    e.printStackTrace();
                    result = new Post();
                }
                return result;
            } catch (Exception e) {
                e.printStackTrace();
                return new Post();
            }
        }

        @Override
        protected void onPostExecute(Post post) {
            super.onPostExecute(post);
            if (post != null) {
                mEmailView.setText(post.getBody());
                System.out.print(post);
            }
        }
    };
    asyncTask.execute();
}

-1

নীচে দেওয়া হিসাবে আপনার কোড পরিবর্তন করুন:

@Override
protected void onPostExecute(String result) {

    runOnUiThread(new Runnable() {
        public void run() {
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("Executed");
        }
    });
}

1
পোস্টপ্যাক্সেকিউট সর্বদা থ্রেড 1 এ চালায় আপনার রানঅনউইথ্রেড ব্যবহার করার দরকার নেই (এটি হয় না?)
justdan0227
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.