অ্যান্ড্রয়েড: আমি কীভাবে অ্যাসিঙ্কটাস্কের অনপ্রেসেক্সট () তে প্যারামিটারগুলি পাস করতে পারি?


116

আমি AsyncTaskলোড অপারেশনগুলির জন্য একটি ব্যবহার করি যা আমি অভ্যন্তরীণ শ্রেণি হিসাবে প্রয়োগ করেছি।

ইন onPreExecute()আমি একটি লোড ডায়লগ যা আমি তারপর আবার লুকিয়ে দেন onPostExecute()। তবে কিছু লোডিং অপারেশনের জন্য আমি আগে থেকেই জানি যে তারা খুব দ্রুত শেষ করবে তাই আমি লোডিং ডায়ালগটি প্রদর্শন করতে চাই না।

আমি এটি বুলিয়ান প্যারামিটার দ্বারা ইঙ্গিত করতে চেয়েছিলাম যা আমি যেতে পারি onPreExecute()তবে দৃশ্যত কোনও কারণে onPreExecute()কোনও প্যারামিটার লাগে না।

স্পষ্টতই কাজটি সম্ভবত আমার অ্যাসিঙ্কটাস্কে বা বাইরের শ্রেণিতে একটি সদস্য ক্ষেত্র তৈরি করা হবে যা প্রতিটি লোডিং অপারেশনের আগে আমাকে নির্ধারণ করতে হবে তবে এটি খুব মার্জিত বলে মনে হচ্ছে না। এই কাজ করতে একটি ভাল উপায় আছে কি?

উত্তর:


231

আপনি কনস্ট্রাক্টরকে ওভাররাইড করতে পারেন। কিছুটা এইরকম:

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

    public MyAsyncTask(boolean showLoading) {
        super();
        // do stuff
    }

    // doInBackground() et al.
}

তারপরে, কার্যটি কল করার সময়, এমন কিছু করুন:

new MyAsyncTask(true).execute(maybe_other_params);

সম্পাদনা করুন: সদস্য ভেরিয়েবলগুলি তৈরি করার চেয়ে এটি আরও কার্যকর কারণ এটি কার্যের অনুরোধকে সহজ করে if উপরের কোডটির সাথে তুলনা করুন:

MyAsyncTask task = new MyAsyncTask();
task.showLoading = false;
task.execute();

3
আমি এখন যা করেছি তা হ'ল এটি। আমার এখনও সদস্য ভেরিয়েবলের দরকার তবে অ্যাসিঙ্কটাস্কে এবং বাইরের শ্রেণিতে নয় যদি আপনি এর অর্থ বোঝান তবেই। এটি আমিই করেছি: প্রাইভেট ক্লাস মাইঅ্যানস্যাকটাস্ক অ্যাসিঙ্কটাস্ককে প্রসারিত করে <শূন্য, শূন্য, শূন্য> {বেসরকারী বুলিয়ান শোলয়েডিং; সর্বজনীন মাইএন্সিঙ্কটাস্ক (বুলিয়ান শো-লোডিং) {সুপার (); this.showLoading = showLoading; // ডু স্টাফ} প্রি-এক্সেকিউট ()} সুরক্ষিত শূন্যতা {যদি (শো-লোডিং) {// ...}} // doInBackground () এবং অন্যান্য। }
স্টিভেন মেলিওপলস

1
হ্যাঁ, এটি বেশ ধারণা ছিল :)
ফেলিক্স

1
অ্যাসিনটাস্ক কনস্ট্রাক্টরে আপনার আসলে সুপার () লাগবে না।
ostergaard

62

1) আমার পক্ষে এটি সর্বাধিক সহজ উপায় হ'ল পরামিতিগুলি async টাস্কে পাস করার মতো

// To call the async task do it like this
Boolean[] myTaskParams = { true, true, true };
myAsyncTask = new myAsyncTask ().execute(myTaskParams);

ঘোষণা করুন এবং এখানে যেমন async টাস্ক ব্যবহার করুন

private class myAsyncTask extends AsyncTask<Boolean, Void, Void> {

    @Override
    protected Void doInBackground(Boolean...pParams) 
    {
        Boolean param1, param2, param3;

        //

          param1=pParams[0];    
          param2=pParams[1];
          param3=pParams[2];    
      ....
}                           

২) অ্যাসিঙ্ক-টাস্কের পদ্ধতিগুলি অ্যাসিঙ্ক-টাস্ক অবকাঠামো (থ্রেড, মেসেজহ্যান্ডলার, ...) কোডিং এড়ানোর জন্য আপনি একাধিক বার প্যারামিটার হিসাবে আপনার অ্যাসিঙ্ক-টাস্কে কার্যকর হওয়া পদ্ধতিগুলি পাস করার বিষয়ে বিবেচনা করতে পারেন। নিম্নলিখিত উদাহরণটি এই পদ্ধতির রূপরেখা দেয়। কনস্ট্রাক্টরের সূচনা পরামিতিগুলি পাস করার জন্য আপনার অ্যাসিঙ্ক-টাস্কটি সাবক্লাসের প্রয়োজন হতে পারে।

 /* Generic Async Task    */
interface MyGenericMethod {
    int execute(String param);
}

protected class testtask extends AsyncTask<MyGenericMethod, Void, Void>
{
    public String mParam;                           // member variable to parameterize the function
    @Override
    protected Void doInBackground(MyGenericMethod... params) {
        //  do something here
        params[0].execute("Myparameter");
        return null;
    }       
}

// to start the asynctask do something like that
public void startAsyncTask()
{
    // 
    AsyncTask<MyGenericMethod, Void, Void>  mytest = new testtask().execute(new MyGenericMethod() {
        public int execute(String param) {
            //body
            return 1;
        }
    });     
}

11

কেন, কীভাবে এবং কোন প্যারামিটারগুলি অ্যাসিনটাস্ক <> এ পাস করা হয়েছে , এখানে বিশদ দেখুন । আমি মনে করি এটি সর্বোত্তম ব্যাখ্যা।

গুগলের অ্যান্ড্রয়েড ডকুমেন্টেশন বলে যে:

একটি অ্যাসিঙ্ক্রোনাস টাস্ক 3 জেনেরিক ধরণের দ্বারা সংজ্ঞায়িত করা হয়, যাকে বলা হয় প্যারামস, প্রগ্রেস এবং রেজাল্ট, এবং 4 টি ধাপ, যা প্রিপেক্সেক্সট, ডোজইনব্যাকগ্রাউন্ড, অনপ্রসেসআপডেট এবং অনপোস্টএক্সেকিউট নামে পরিচিত।

অ্যাসিঙ্কটাসকের জেনেরিক প্রকারগুলি:

একটি অ্যাসিক্রোনাস টাস্ক দ্বারা ব্যবহৃত তিন ধরণের নিম্নলিখিত:

প্যারামগুলি, কার্যকর করার পরে টাস্কে পাঠানো পরামিতিগুলির ধরণ। অগ্রগতি, পটভূমি গণনার সময় প্রকাশিত অগ্রগতির ইউনিটগুলির ধরণ। ফলাফল, পটভূমি গণনার ফলাফলের ধরণ। সবসময় সবসময় একটি অ্যাসিক্রোনাস টাস্ক দ্বারা ব্যবহৃত হয় না। কোনও প্রকারকে অব্যবহৃত হিসাবে চিহ্নিত করতে কেবল অকার্যকর টাইপটি ব্যবহার করুন:

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

আপনি আরও উল্লেখ করতে পারেন: http://developer.android.com/references/android/os/AsyncTask.html

অথবা সংকর-গণেশের ব্লগটি উল্লেখ করে আপনি AsyncTask এর ভূমিকা কী তা সাফ করতে পারেন

আচ্ছা একটি সাধারণ অ্যাসিঙ্কটাস্ক শ্রেণীর কাঠামো এর মতো হয়:

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){ 

    } 

নতুন থ্রেড শুরু করার আগে এই পদ্ধতিটি কার্যকর করা হয়। কোনও ইনপুট / আউটপুট মান নেই, সুতরাং কেবল ভেরিয়েবলগুলি শুরু করুন বা আপনার যা করা দরকার মনে করুন।

protected Z doInBackground(X...x){

}

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

সুরক্ষিত শূন্যপরিবর্তিত অগ্রযাত্রা (Y y) {

} এই পদ্ধতিটি প্রকাশিত প্রোগ্রেস (y) পদ্ধতিটি ব্যবহার করে ডাকা হয় এবং এটি আপনি যখন প্রধান পর্দায় কোনও অগ্রগতি বা তথ্য প্রদর্শন করতে চান এমন একটি প্রগতি বারের মতো আপনি ব্যাকগ্রাউন্ডে করছেন অপারেশনটির অগ্রগতি দেখানোর জন্য ব্যবহৃত হয়।

পোষ্টএক্সেকিউট (জেড z) protected রক্ষিত শূন্যতা {

Method ব্যাকগ্রাউন্ডে অপারেশন হয়ে যাওয়ার পরে এই পদ্ধতিটি বলা হয়। ইনপুট প্যারামিটার হিসাবে আপনি doInBackground পদ্ধতির আউটপুট প্যারামিটার পাবেন।

এক্স, ওয়াই এবং জেড ধরণের কী হবে?

আপনি উপরের কাঠামো থেকে অনুমান করতে পারেন:

X  The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y  The type of the objects you are going to enter in the onProgressUpdate method.

 Z  The type of the result from the operations you have done in the background process.

বাইরের শ্রেণি থেকে কীভাবে আমরা এই কাজটিকে কল করব? কেবলমাত্র দুটি লাইন দিয়ে:

MyTask myTask = new MyTask();

myTask.execute(x);

যেখানে x হ'ল এক্স টাইপের ইনপুট প্যারামিটার Where

আমাদের কাজটি একবার চালিয়ে গেলে, আমরা এর অবস্থানটি "বাইরে থেকে" খুঁজে পেতে পারি। "GetStatus ()" পদ্ধতি ব্যবহার করে।

myTask.getStatus (); এবং আমরা নিম্নলিখিত স্থিতি পেতে পারি:

চলমান - ইঙ্গিত দেয় যে টাস্কটি চলছে।

পেন্ডিং - ইঙ্গিত দেয় যে টাস্কটি এখনও কার্যকর করা হয়নি।

সমাপ্ত - ইঙ্গিত করে যে পোস্টপ্যাক্সেকুট (জেড) শেষ হয়েছে।

AsyncTask ব্যবহার সম্পর্কে ইঙ্গিত

প্রি এক্সেক্সট, ডোইনব্যাকগ্রাউন্ড এবং অনপস্টএক্সিকিউটে ম্যানুয়ালি পদ্ধতিগুলিকে কল করবেন না। এটি স্বয়ংক্রিয়ভাবে সিস্টেম দ্বারা সম্পন্ন হয়।

আপনি অন্য একটি অ্যাসিঙ্কটাস্ক বা থ্রেডের মধ্যে অ্যাসিঙ্কটাস্ক কল করতে পারবেন না। কার্যকর করার কলটি ইউআই থ্রেডে করতে হবে।

পোস্টপেক্সেকিউট পদ্ধতিটি ইউআই থ্রেডে কার্যকর করা হয় (এখানে আপনি অন্য একটি এসিঙ্কটাস্ক কল করতে পারেন!)।

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


4

আপনি হয় টাস্ক কন্সট্রাক্টরের পরামিতিটি পাস করতে পারেন বা যখন আপনি এক্সিকিউটিভ কল করবেন:

AsyncTask<Object, Void, MyTaskResult>

প্রথম প্যারামিটার (অবজেক্ট) doInBackগ্রাউন্ডে পাস করা হয়েছে। তৃতীয় প্যারামিটার (MyTaskResult) doInBackground দ্বারা ফিরে আসে। আপনি তাদের নিজের পছন্দ অনুযায়ী পরিবর্তন করতে পারেন। তিনটি বিন্দু মানে শূন্য বা আরও বেশি অবজেক্ট (বা তাদের একটি অ্যারে) যুক্তি (গুলি) হিসাবে পাস হতে পারে।

public class MyActivity extends AppCompatActivity {

    TextView textView1;
    TextView textView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);    
        textView1 = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);

        String input1 = "test";
        boolean input2 = true;
        int input3 = 100;
        long input4 = 100000000;

        new MyTask(input3, input4).execute(input1, input2);
    }

    private class MyTaskResult {
        String text1;
        String text2;
    }

    private class MyTask extends AsyncTask<Object, Void, MyTaskResult> {
        private String val1;
        private boolean val2;
        private int val3;
        private long val4;


        public MyTask(int in3, long in4) {
            this.val3 = in3;
            this.val4 = in4;

            // Do something ...
        }

        protected void onPreExecute() {
            // Do something ...
        }

        @Override
        protected MyTaskResult doInBackground(Object... params) {
            MyTaskResult res = new MyTaskResult();
            val1 = (String) params[0];
            val2 = (boolean) params[1];

            //Do some lengthy operation    
            res.text1 = RunProc1(val1);
            res.text2 = RunProc2(val2);

            return res;
        }

        @Override
        protected void onPostExecute(MyTaskResult res) {
            textView1.setText(res.text1);
            textView2.setText(res.text2);

        }
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.