Bài đăng phổ biến

Chủ Nhật, 4 tháng 11, 2012

AsyncTask Trong Android

Nguồn: http://www.24h-mobile.com/data/AsyncTask-Trong-Android.html

1. Giới thiệu


Một chương trình chạy trên Android có thể sẽ có cấu trúc phức tạp. Yêu cầu kết nối đến Server, CSDL, tải file … Nếu chúng ta xử lý các công việc đó trên Main Thread sẽ làm ứng dụng có vẻ chạy chậm hay treo vì chúng làm gián đoạn việc cập nhật, xử lý trên GUI. Có nhiều cách để giải quyết vấn đề này: sử dụng Service, Thread hay đơn giản hơn là dùng Async Task (Asynchronous Task).

2. Class AsyncTask

Class này cho phép chúng ta chạy tác vụ nền và sau đó trả lại kết quả cập nhật lên GUI mà không phải động đến Thread/handler khá rắc rối và đau đầu.

Sử dụng:

private class MyTask extends AsyncTask <Params, Progress, Result>{

    @Override
        protected void onPreExecute() {
            
        }
        
        @Override
        protected Result doInBackground(Params param) {
            
        }
        
        @Override
        protected void onProgressUpdate(Progress progress) {
          
        }
        
        @Override
        protected void onPostExecute(Result result) {
           
        }


Trong đó:

- Params: các parameters được truyền vào khi task được thực hiện
- Progress: Các thông tin về tiến độ task được trả về khi task chạy
- Result: Kết quả cuối cùng khi task xong.
- Không phải khi nào cũng phải sử dụng đầy đủ chúng. Để đánh dấu không dùng ta sử dụng kiểu Void

VD:

private class SearchSrv extends AsyncTask<Void, Void, PlacesList>


4 bước thực hiện task (Không nhất thiết phải đầy đủ)

onPreExecute()  báo thay đổi đến UI ngay khi task chạy, thường được dùng để hiện progressbar chẳng hạn.
doInBackground(Params...) Thực hiện khi bước 1 xong. Dùng để xử lý Task, có thể tốn nhiều thời gian. Kết quả trả về sẽ được đưa qua bước 4. 
onProgressUpdate(Progress...), cập nhật tiến độ Task
onPostExecute(Result), trả về kết quả cập nhật lên UI.

3. Chú ý

- Task instance và instance.execute() phải được tạo và chạy  trong UI Thread.
- Không gọi các phương thức onPreExecute, doInBackGround,onProgressUpdate, onPostExecute thủ công.
- Task chỉ có thể được chạy 1 lần (Nếu khởi chạy lần thứ 2 sẽ có exception)





Không có nhận xét nào:

Đăng nhận xét