
Để dùng AsyncTask chúng ta cần thừa kế lớp AsyncTask và ghi đè vài hàm trong lớp đó, chỉ có hàm doInBackground là bắt buộc còn lại có thể ghi đè có thể không.
Ý nghĩa các hàm:
- onPreExecute: hàm này chạy trước khi hàm doInBackground chạy. Có thể tương tác với Main UI Thread ở đây như show Toast hay Dialog.
-
doInBackground: Chạy ngầm với tham số truyền vào là mảng, mảng có thể là dối tượng của 1 class nào đó hoặc một mảng số nguyên thuỷ. Hàm này có có thể không truyền gì vào cũng được.
+ Nếu có tham số truyền vào và trả về khi thực hiện xong thì lúc tạo lớp AsyncTask trong như thế này: private static class SaveImageAsync extends AsyncTask<SaveImgObj, Void, Bitmap>
+ Nếu không có gì truyền vào và không trả về gì trông như thế này: private static class SaveImageAsync extends AsyncTask<Void, Void, Void>
- onPostExecute: khi hàm doInBackground chạy xong hết, ở đây có thể làm việc với MainUI như hàm onPreExecute. Hàm này không được gọi nếu task bị cancel.
Về cơ bản là như thế bây giờ chúng ta đi implement:
Tạo lớp SaveImageAsync thừa kế từ lớp AsyncTask
// use a thread to save img, the purpose to prevent crash main UI
private static class SaveImageAsync extends AsyncTask<SaveImgObj, Void, Bitmap> {
private WeakReference<MainActivity> activityReference;
SaveImageAsync(Context context) {
activityReference = new WeakReference<>((MainActivity) context);
}
@Override
protected Bitmap doInBackground(SaveImgObj... saveImgObjs) {
//Thao tác mất thời gian xử lý ở đây.
return bitmap1;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
MainActivity activity = activityReference.get();
if (activity != null) {
ProgressDialogManager.getInstance().dismiss();
}
}
}
Mình tạo thêm đối tượng activityReference để có thể gọi được các hàm từ MainActivity.
Chú ý:
Để truyền nhiều đối tượng vào cho doInBackground ta chỉ cần truyền vào dạng đối tượng và lấy ra theo cách lấy mảng như thế này:
Tạo class với các tham số như sau:
private static class SaveImageAsync extends AsyncTask<Object, Void, Void>
Lấy dữ liệu từ tham số:
Do chúng ta truyền vào dạng Object chung cho tất cả các lớp nên ta cần ép kiểu về lớp chúng ta cần. Như bạn biết Object là lớp cha của tất cả các lớp.
@Override
protected Void doInBackground(Object... objects) {
SaveImgObj imgObj = (SaveImgObj) objects[0];
Resources resource = (Resources) objects[1];
// xử lý
return null;
}
Lúc truyền vào:
new SaveImageAsync().execute(new SaveImgObj(111,111),getResources());
Tạo một đối tượng lớp SaveImgObj để truyền vào
public class SaveImgObj {
float width;
float height;
public SaveImgObj(float width, float height) {
this.width = width;
this.height = height;
}
public float getWidth() {
return width;
}
public void setWidth(float width) {
this.width = width;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
}
Đây chỉ lớp thông thường trong Java.
Chạy ngay SaveImageAsync
Chúng ta chạy ngay mà không cần tạo biến local hay trường cho đối tượng SaveImageAsync
new SaveImageAsync(this).execute(new SaveImgObj(111,111));
Các bài viết không xem thì tiếc:
- Siêu tổng hợp android code snippets (cập nhật thường xuyên)
- Siêu tổng hợp iOS code snippets – Objective C
- Lập trình với Recyclerview trong Android – Bài 2 | dotrinh.com
- Làm việc với font trong Android
- Lập trình với Recyclerview trong Android – Bài 3 | dotrinh.com
- Fragment và Activity trong android cơ bản
- Chuyển một đối tượng sang Json trong Android
- Hiểu về cách tổ chức file, bộ nhớ của app Android
- Lập trình với Recyclerview trong Android – Bài 1 | dotrinh.com
- Gửi dữ liệu đến BLESerial3 bằng Bluetooth LE Android
- Truyền dữ liệu giữa 2 fragment trong android
- Cách dùng Eventbus để truyền dữ liệu trong Android
- Lập trình phóng to thu nhỏ ảnh pinch in – pinch out trong Android
- Lưu ý với hàm drawText() trong Android
- Tạo seekbar và kiến thức hữu ích về seekbar trong Android

1 Comment