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