Cách dùng AsyncTask trong Android

3.7/5 - (3 votes)

Để 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:

1 Comment

Thảo luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Xem thêm
Dùng thư viện này khá là đơn giản, cám ơn…
 
 
 
 
Facetime iPhone

Main Menu