آموزش AsyncTask در برنامه نویسی اندروید

امتیاز 4.00 ( 1 رای )

سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش AsyncTask در برنامه نویسی اندروید می پردازیم با استفاده از Async Task به شما قابلیتی می دهد تا کار های بسیار سنگین را در background انجام دهید و بخش Ui را بدون اینکه قفل شود یعنی بدون گیر کردن قابل استفاده خواهد بود برنامه به طور معمول در single Thread اجرا می شود و در صورتی که برنمامه اعمال background سنگین داشته باشد ممکن از Ui ما حالت Responsive خود را از دست بدهد و همش منتظر عملیات Background باشد برای اینکه از این کار جلوگیری کنیم از AsyncTask استفاده می کنیم.
چهار متود در کلاس asyncTask وجود دارد
doInBackground() تمامی عملیات های background در این متود قرار می گیرد و هر زمانی که بخواهیم result خود را به Ui می فرستیم.
onPreExecute() قبل از اینکه عملیات background ما اجرا شود این متود اجرا شده است.
onPostExecute() بعد از اینکه متود doInBackground ما به اتمام رسید بلافاصله یک نتیجه به این متود ارسال می شود.
onProgressUpdate() این متود مقدار پیشرفت عملیات را update می کند و مقدار آن update را به UI Thread می برد تا در آن جا نیز تغییراتی اعمال شود. شاید با یک مثال بهتر متوجه شوید اگر ما یک progressbar داشته باشیم و بخواهیم همزمان با انجام عملیات مقدار آن نیز تغییر کند (update شود ) و مقدار آن در Ui نیر تغییر کند.
یک فایل به نام activity_main.xml ایجاد کنید و کد های زیر را در آن قرار دهید.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    <TextView
        android:id="@+id/tv_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="10pt"
        android:textColor="#444444"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="9dip"
        android:layout_marginTop="20dip"
        android:layout_marginLeft="10dip"
        android:text="Sleep time in Seconds:"/>
    <EditText
        android:id="@+id/in_time"
        android:layout_width="150dip"
        android:layout_height="wrap_content"
        android:background="@android:drawable/editbox_background"
        android:layout_toRightOf="@id/tv_time"
        android:layout_alignTop="@id/tv_time"
        android:inputType="number"
        />
    <Button
        android:id="@+id/btn_run"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Run Async task"
        android:layout_below="@+id/in_time"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="64dp" />
    <TextView
        android:id="@+id/tv_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="7pt"
        android:layout_below="@+id/btn_run"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

شامل یک TextView برای نمایش پیام و یک EditText برای دریافت یک ورودی یک دکمه برای انجام کار و یک TextView دیگر برای نمایش result
حالا یک فایل به نام MainActivity.java ایجاد کرده و کد زیر را در آن قرار دهید.

package ir.programchi;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
    private Button button;
    private EditText time;
    private TextView finalResult;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        time = (EditText) findViewById(R.id.in_time);
        button = (Button) findViewById(R.id.btn_run);
        finalResult = (TextView) findViewById(R.id.tv_result);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AsyncTaskRunner runner = new AsyncTaskRunner();
                String sleepTime = time.getText().toString();
                runner.execute(sleepTime);
            }
        });
    }
    private class AsyncTaskRunner extends AsyncTask<String, String, String> {
        private String resp;
        ProgressDialog progressDialog;
        @Override
        protected String doInBackground(String... params) {
            publishProgress("Sleeping...");
            try {
                int time = Integer.parseInt(params[0])*1000;
                Thread.sleep(time);
                resp = "Slept for " + params[0] + " seconds";
            } catch (InterruptedException e) {
                e.printStackTrace();
                resp = e.getMessage();
            } catch (Exception e) {
                e.printStackTrace();
                resp = e.getMessage();
            }
            return resp;
        }
        @Override
        protected void onPostExecute(String result) {
            progressDialog.dismiss();
            finalResult.setText(result);
        }
        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(MainActivity.this,
                    "ProgressDialog",
                    "Wait for "+time.getText().toString()+ " seconds");
        }
        @Override
        protected void onProgressUpdate(String... text) {
            finalResult.setText(text[0]);
        }
    }
}

ابتدا یک کلاس به نام AsyncTaskRunner ایجاد کردیم و به AsyncTask گسترشش دادیم برای اینکه بتوانیم از asynctask استفاده کنیم سپس view های مربوط به هر object را به دست آوردیم ما برای اینکه به شما مقدار آپدیت را نمایش بدهیم از progressbar استفاده کردیم قبل این کد هم بقیه void ها را توضیح دادیم.
در ادامه می توانید پیش نمایشی از کد بالا را ببینید.
 

 
این آموزش به پایان رسید.
 
موفق و موید باشید.

مطالعه بیشتر