Udhëzues shembulli i Android AsyncTask


Sot do të shqyrtojmë Android AsyncTask. Ne do të zhvillojmë një aplikacion shembull Android që kryen një AsyncTask abstrakt në sfond.

Android AsyncTask

Android AsyncTask është një klasë abstrakte e ofruar nga Android e cila na jep lirinë për të kryer detyra të rënda në sfond dhe për të mbajtur të lehtë fillin e ndërfaqes së përdoruesit, duke e bërë kështu aplikacionin më të përgjegjshëm. Aplikacioni Android funksionon në një fije të vetme kur lansohet. Për shkak të këtij modeli me një fije, detyrat që kërkojnë më shumë kohë për të marrë përgjigjen mund ta bëjnë aplikacionin të mos përgjigjet. Për të shmangur këtë, ne përdorim Android AsyncTask për të kryer detyrat e rënda në sfond në një fill të dedikuar dhe për t'i kaluar rezultatet përsëri në fillin e ndërfaqes së përdoruesit. Prandaj, përdorimi i AsyncTask në aplikacionin android e mban fillin e ndërfaqes së përdoruesit të përgjegjshëm në çdo kohë. Metodat bazë të përdorura në një klasë Android AsyncTask janë përcaktuar më poshtë:

  • doInBackground() : Kjo metodë përmban kodin që duhet të ekzekutohet në sfond. Në këtë metodë ne mund të dërgojmë rezultate disa herë në fillin e UI me metodën publicProgress(). Për të njoftuar se përpunimi i sfondit ka përfunduar, thjesht duhet të përdorim deklaratat e kthimit
  • onPreExecute() : Kjo metodë përmban kodin që ekzekutohet përpara se të fillojë përpunimi i sfondit
  • onPostExecute() : Kjo metodë thirret pasi metoda doInBackground përfundon përpunimin. Rezultati nga doInBackground i kalohet kësaj metode
  • onProgressUpdate() : Kjo metodë merr përditësime të progresit nga metoda doInBackground, e cila publikohet nëpërmjet metodës publicProgress dhe kjo metodë mund ta përdorë këtë përditësim progresi për të përditësuar fillin e ndërfaqes së përdoruesit

Tre llojet e përgjithshme të përdorura në një klasë Android AsyncTask janë dhënë më poshtë:

  • Paramet : Lloji i parametrave të dërguar në detyrë pas ekzekutimit
  • Progresi : Lloji i njësive të progresit të publikuara gjatë llogaritjes së sfondit
  • Rezultati : Lloji i rezultatit të llogaritjes së sfondit

Shembull Android AsyncTask

Për të nisur një AsyncTask, fragmenti i mëposhtëm duhet të jetë i pranishëm në klasën MainActivity:

MyTask myTask = new MyTask();
myTask.execute();

Në fragmentin e mësipërm ne kemi përdorur një emër klase shembull që zgjeron AsyncTask dhe metoda e ekzekutimit përdoret për të nisur fillin e sfondit. Shënim:

  • Instanca AsyncTask duhet të krijohet dhe thirret në ndërfaqen e ndërfaqes së përdoruesit.
  • Metodat e anashkaluara në klasën AsyncTask nuk duhet të thirren kurrë. Ata thirren automatikisht
  • AsyncTask mund të thirret vetëm një herë. Ekzekutimi i tij përsëri do të sjellë një përjashtim

Në këtë tutorial ne do të zbatojmë një AsyncTask që bën një proces për të shkuar në gjumë për një periudhë të caktuar kohore siç është caktuar nga përdoruesi.

Struktura e projektit të detyrave asinkronike të Android

Kodi i shembullit të Android AsyncTask

Paraqitja xml përcaktohet në aktivitetin_main.xml dhe jepet më poshtë: activity_main.xml

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://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>

Në paraqitjen e mësipërme ne kemi përdorur një vizatim të paracaktuar si kufiri i EditText. MainActivity.java është përcaktuar më poshtë:

package com.journaldev.asynctask;

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..."); // Calls onProgressUpdate()
            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) {
            // execution of result of Long time consuming operation
            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]);
            
        }
    }
}

Shkarkoni Projektin Shembull Android AsyncTask