- [VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
- [C#] Hướng dẫn đọc thông số thiết bị Thiết bị kiểm tra Pin (HIOKI BATTERY HiTESTER BT3562)
- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
- [C#] Thiết kế ứng dụng Console đẹp với thư viện Spectre.Console
- [C#] Thiết kế ứng dụng Single Instance và đưa ứng dụng lên trước nếu kiểm tra ứng dụng đang chạy
- [C#] Giới thiệu JSON Web Token và cách đọc chuỗi token
- [C#] Cách tăng giảm font chữ tất cả các control trên winform
- [DEVEXPRESS] Tích hợp chức năng Tìm kiếm Search vào CheckedComboboxEdit
- [C#] Gởi email Metting Calendar Reminder kèm nhắc thời gian lịch họp
- [C#] Tìm kiếm xem danh sách từ khóa có tồn tại trong đoạn văn bản hay không
- [C#] Thiết kế giao diện ứng dụng trên Console sử dụng thư viện Terminal.Gui
- [C#] Hướng dẫn tạo mã VietQR Payment API Winform
- [C#] Sử dụng thư viện BenchmarkDotNet đo hiệu năng của hảm Method
- [DEVEXPRESS] Tìm kiếm không dấu tô màu highlight có dấu trên C# Winform
Lập trình android - Xử lý bất đồng bộ với AsyncTask trong Android
Xử lý bất đồng bộ, hay còn gọi là xử lý đa tiến trình với AsyncTask là phương tiện để xử lý công việc sử dụng background thread và giao tiếp với UI thread mà không dùng Thread hay Handler, có dữ liệu trả về. Vì được khuyến cáo là nên sử dụng AsyncTask thay cho Handler nên mình sẽ bỏ qua không nói đến trong bài này.
Đối với AsyncTask thì ta cần tạo một lớp kế thừa từ AsyncTask, sau đó từ MainActivity ta gọi hàm execute() của tiến trình này là OK..
VD:
public class DoLogin extends AsyncTask
Các khái niệm về AsyncTask
AsyncTask<Params, Progress, Result> có 3 đối số là các Generic Type:
- Params: Là giá trị ((biến) được truyền vào khi gọi thực thi tiến trình và nó sẽ được truyền vào doInBackground
- Progress: Là giá trị (biến) dùng để update giao diện diện lúc tiến trình thực thi, biến này sẽ được truyền vào hàm onProgressUpdate.
- Result: Là biến dùng để lưu trữ kết quả trả về sau khi tiến trình thực hiện xong.
Những đối số nào không sử dụng trong quá trình thực thi tiến trình thì ta thay bằng Void.
Thông thường trong 1 AsyncTask sẽ chứa 4 hàm, đó là :
- onPreExecute() : Tự động được gọi đầu tiên khi tiến trình được kích hoạt.
- doInBackground(): Được thực thi trong quá trình tiến trình chạy nền, thông qua hàm này để ta gọi hàm onProgressUpdate để cập nhật giao diện (gọi lệnh publishProgress). Ta không thể cập nhật giao diện trong hàm doInBackground().
- onProgressUpdate (): Dùng để cập nhật giao diện lúc runtime.
- onPostExecute(): Sau khi tiến trình kết thúc thì hàm này sẽ tự động sảy ra. Ta có thể lấy được kết quả trả về sau khi thực hiện tiến trình kết thúc ở đây.
Trong 4 hàm trên thì hàm doInBackground() bắt buộc phải tồn tại, trình biên dịch sẽ yêu cầu bạn add nó vào, còn các hàm khác có thể khuyết, nhưng theo khuyến cáo các bạn nên sử dụng đầy đủ 4 hàm đã nêu.
DEMO ứng dụng của AsyncTask
Bài ví dụ đơn giản là cập nhật Progressbar (không quản lý kết quả trả về), nên đối số 1 và đối số 3 ta để Void, đối số 2 ta để Integer. tui sẽ sử dụng 2 kiểu progressBar cùng thể hiện xử lý.
Đầu tiên tạo một ứng dụng như hình, và một class dùng để xử lý MyAsyncTask kế thừa AsyncTask.
Layout XML:
<!--?xml version="1.0" encoding="utf-8"?-->
<android.support.constraint.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.erp_tuyen.asynctaskdemo.MainActivity">
<linearlayout android:layout_width="match_parent" android:layout_height="383dp" android:layout_marginend="8dp" android:layout_marginstart="8dp" android:gravity="center" android:orientation="vertical" app:layout_constraintbottom_tobottomof="parent" app:layout_constraintend_toendof="parent" app:layout_constrainthorizontal_bias="0.0" app:layout_constraintstart_tostartof="parent" app:layout_constrainttop_totopof="parent" app:layout_constraintvertical_bias="0.0">
<textview android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="LaptrinhVB.Net" android:textsize="30dp">
<progressbar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content">
<progressbar android:id="@+id/progressBar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="68dp" app:layout_constrainttop_tobottomof="@+id/textView" tools:layout_editor_absolutex="168dp">
<textview android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="48dp" android:text="" app:layout_constrainttop_totopof="parent" tools:layout_editor_absolutex="163dp">
<button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="56dp" android:text="TONA EZ" app:layout_constrainttop_tobottomof="@+id/progressBar" tools:layout_editor_absolutex="148dp">
</button></textview></progressbar></progressbar></textview></linearlayout></android.support.constraint.constraintlayout>
Class MyAsynceTask.java:
package com.example.erp_tuyen.asynctaskdemo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
* Created by Erp-Tuyen on 04/01/2018.
*/
public class MyAsyncTask extends AsyncTask {
//ProgressBar progressBar;
TextView textView;
Button button;
//khai báo Activity để lưu trữ địa chỉ của MainActivity
Activity contextCha;
//constructor này được truyền vào là MainActivity
public MyAsyncTask(Activity ctx)
{
contextCha=ctx;
Log.i("TONAER","MyAsyncTask");
}
//hàm này sẽ được thực hiện đầu tiên
@Override
protected void onPreExecute() {
ProgressBar progressBar=(ProgressBar) contextCha.findViewById(R.id.progressBar);
progressBar.setVisibility(View.VISIBLE);
// TODO Auto-generated method stub
super.onPreExecute();
Toast.makeText(contextCha, "onPreExecute!",
Toast.LENGTH_LONG).show();
}
//sau đó tới hàm doInBackground
//tuyệt đối không được cập nhật giao diện trong hàm này
@Override
protected Void doInBackground(Void... arg0) {
for(int i=0;i<=100;i++)
{
//nghỉ 100 milisecond thì tiến hành update UI
SystemClock.sleep(100);
//khi gọi hàm này thì onProgressUpdate sẽ thực thi
publishProgress(i);
}
return null;
}
/**
* ta cập nhập giao diện trong hàm này
*/
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
//thông qua contextCha để lấy được control trong MainActivity
//R.id.progressBar1: là pgbar kiểu ngang, nó sẽ chạy theo % của thanh
ProgressBar progressBar2=(ProgressBar) contextCha
.findViewById(R.id.progressBar1);
//vì publishProgress chỉ truyền 1 đối số
//nên mảng values chỉ có 1 phần tử
int giatri=values[0];
//tăng giá trị của Progressbar lên
progressBar2.setProgress(giatri);
//đồng thời hiện thị giá trị là % lên TextView
TextView textView=(TextView)
contextCha.findViewById(R.id.textView);
textView.setText(giatri+"%");
}
/**
* sau khi tiến trình thực hiện xong thì hàm này sảy ra
*/
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(contextCha, " GG WP !",
Toast.LENGTH_LONG).show();
ProgressBar progressBar=(ProgressBar) contextCha.findViewById(R.id.progressBar);
progressBar.setVisibility(View.GONE);//dùng cái này để dừng cái pgbar hình tròn.
}
/**
* tui làm 2 hàm ví dụ này về params trong Android, để chơi thôi không có tác dụng gì trong cái AsyncTask này
*/
public void goividu()
{
viduParamschoham();
viduParamschoham(5);
viduParamschoham(5,6);
viduParamschoham(5,6,5,6,7,8,9,0,0);
}
/**
* dấu ... dùng khai báo param
* tức là ta truyền bao nhiêu đối số cũng được
* ds trở thành mảng 1 chiều
* @param ds
*/
public void viduParamschoham(int ... ds)
{
//test chơi...
int pt0=ds[0];//có lỗi nếu như không truyền đối số nào
for(int n:ds)
{
System.out.println(n);
}
//hoặc
for(int i=0;i
Và MainAcivity.java. Tiến trình MyASyncTask sẽ được thực thi khi bên MainActivity ta gọi phương thức: .execute():
package com.example.erp_tuyen.asynctaskdemo;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity {
Button button;
MyAsyncTask mytt;
public ProgressBar progressBar,progressBar1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar =(ProgressBar)this.findViewById(R.id.progressBar);
progressBar1 =(ProgressBar)this.findViewById(R.id.progressBar1);
stopProg();
button=(Button)this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
doStart();
}
});
}
public void stopProg(){
progressBar.setVisibility(View.GONE);
}
private void doStart()
{
//truyền this (chính là MainActivity hiện tại) qua Child Thread
mytt =new MyAsyncTask(this);
//Kích hoạt Tiến trình
//khi gọi hàm này thì onPreExecute của mytt sẽ thực thi trước
mytt.execute();
}
}
Như vậy là đã hoàn tất. Code đã được comment rất tỷ mỹ, hãy để lại comment để được giải đáp hoặc đặt câu hỏi lên fanpage của LaptrinhVB.
Bạn có thể tham khảo source code tại đây
Trong bài tiếp tui sẽ làm một demo về AsynceTask có dữ liệu trả về, đống thời có kết nối với SQL Server, các bạn chú ý theo dõi.
Nguồn: Tổng hợp từ Internet.