Để 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:
- Chuyển một đối tượng sang Json trong Android
- Lập trình phóng to thu nhỏ ảnh pinch in – pinch out trong Android
- Cách dùng Eventbus để truyền dữ liệu trong Android
- Lập trình với Recyclerview trong Android – Bài 2 | dotrinh.com
- Truyền dữ liệu giữa 2 fragment trong android
- Tạo seekbar và kiến thức hữu ích về seekbar trong Android
- Phóng to thu nhỏ trong Android với ScaleGestureDetector
- Lập trình với Recyclerview trong Android – Bài 1 | dotrinh.com
- Lập trình với Recyclerview trong Android – Bài 3 | dotrinh.com
- Làm việc với font trong Android
- Siêu tổng hợp android code snippets (cập nhật thường xuyên)
- Hiểu về cách tổ chức file, bộ nhớ của app Android
- Gửi dữ liệu đến BLESerial3 bằng Bluetooth LE Android
- Lưu ý với hàm drawText() trong Android
- Tạo shortcut cho ứng dụng khi cài Android app programmatically
1 Comment