Monthly Archives: October 2012

AsyncTask – Android

Bài việt này sẽ giúp bạn hiểu hơn về AsyncTask và cách sử dụng nó trong Android, bài viết không mang tính hàn lâm nếu có từ nào sai chuyên nghành mọi người góp ý để mình sửa .
Trước tiên như tất cả công việc học một Framework mới nào chúng ta đều không quên vào trang tài liệu của android để đọc cách sử dụng các API, bạn tham khảo về AsyncTask tại đây : http://developer.android.com/reference/android/os/AsyncTask.html

Khi nào bạn cần sử dụng AsyncTask

% lớn là bạn chưa có nhiều kiến thức chắc về Thread (dành cho người mới, còn nếu là developer chuyên thì họ sẽ biết khi nào nên dùng) và bạn chưa thể sử lý tốt nếu bạn sử dụng đối tượng Thread thật sự . Bạn sử dụng AsyncTask khi bạn cần thực hiện một công việc dưới background và muốn public kết quả đó lên UI, ok quay lại một chút, mình có một tình huống này, khi bạn download 1 file theo truyền thống bạn sử lý code trong sự kiện onClick của một Button, và khi bạn click vào Button đó thì lập tức Android sẽ Block-UI, để thực thi tác vụ của bạn, điều này thật tệ khi người dùng click vào button đó xong thì chẳng biết điều gì xảy ra mới chương trình họ đang sử dụng, chẳng có một thông báo đồng bộ để họ biết chương trình đang download file . và khi đó bạn nên dùng AsyncTask để làm cho ứng dụng của bạn tốt hơn bởi đối tượng này có khả năng làm việc dưới background và public kết quả lên UI, lợi dụng điểm đó bạn có thể tạo một Progressbar để update % download file .

Lập trình với nó ra sao

thứ nhất muốn sử dụng AsyncTask thì nó luôn là một subclass, kiểu như class nội, thứ hai bạn cần override lại ít nhất 1 phương thức đó là doInBackground .

Class A{
class B extends AsyncTask
}

Thứ hai tham số cho việc khởi tạo AsyncTask có 3 tham số :
1 .Params – Bạn hiểu đơn giản nhất đây là tham số input
2. Progress – Bạn hiểu như đây là dữ liệu trả ra để bạn làm công việc với UI (ví dụ như bạn cần một kiểu integer để update % cho progressbar …)
3. Result – Bạn hiểu đây là kết quả trả ra trong quá trình tính toán từ Background (và nếu bạn sử dụng kết quả này, kết hợp với tham số Progress thì chắc chắn bạn cần tính toán để chuyện ép kiểu nếu một kiểu trả ra là Long và một kiểu trả ra là Intefer) .

Cùng ngẫm ví dụ này

private class DownloadFilesTask extends AsyncTask {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

Ba tham số chúng ta tương ứng là , Và đoạn code này nói lên Tôi truyền vào AsyncTash một URL chưa đường dẫn tới file cần download, rồi lấy url đó đưa vào doInBackground để thực hiện Download, kết quả tính kích thước của file đó là kiểu Long file có thể lớn mà, Long là ok nhỉ . và tham số cuối là progress là kiểu Int để update % cho progressbar . OK .

Chú ý nhá, doInBackground không dùng để update UI, bởi thể bạn dùng nó để setText cho thằng nào đó là hỏng hết bánh kẹo đó, hàm này chỉ dùng để tính toán, hàm này onPostExecute dùng để update UI này . Ok xong, tạm thế, có gì phát sinh
thì comment nhé, Mọi ý kiến đóng góp mình luôn thân ái chào đón để sửa cho đúng.

Thân Ái & Quyết Thắng