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

Advertisements

2 thoughts on “AsyncTask – Android

  1. nguyễn huy hoàng

    cho tôi hỏi là : khi chạy 1 app, và đối tượng 1 sẽ hoạt động không dừng ( ví dụ : di chuyển qua lại mãi mãi) . và hành động khác được chạy xen vào( ví dụ : ta touch vào đối tượng thì đối tượng đó xoay 1 vòng) và hành động 1 dừng lại chờ hành động 2 thực thi xong thì chạy tiếp. thì ta phải dùng asynctask như thế nào ak ?

    Reply
    1. Sharing Post author

      sẽ tốt hơn nếu bạn có một app nào đó mô phỏng :D. Theo chủ quan của mình thì những công việc nào thực hiện trong background và có giới hạn khi nào hoàn thành thì mình dùng nó, bởi bạn thân đối tượng có các method nói lên điều đó, nhưn Pre, background và finish … . Đối với trường hợp của bạn mình sẽ thấy nên xem xét một đối tượng Runnable mUpdateTimeTask = new Runnable() {} và postDelayed, bạn có thể đệ quy mUpdateTimeTask với postDelayed để tạo background thread và runOnUiThread để update UI, ví dụ khi click vào đối tượng button thì change đối tượng này thành progressbar như bạn nói, khi check background thì bạn có thể dùng asynctask khi finish thì call runOnUiThread để change progressbar thành gì bạn muốn, or show , hide cái gì đó .

      Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s