MultiThreading: AsyncTask trong Android


Giới thiệu

Trong ứng dụng Android có nhiều tác vụ (task) chạy song song với nhau để đảm bảo ứng dụng của chúng ta tận dụng được hết khả năng của CPU và mang  lại performence cho ứng dụng. Vậy để lập trình được nhiều tác vụ chạy song song trong ứng dụng Android như thế nào thì bài viết này sẽ cùng các bạn tìm hiểu chi tiết.

Bài viết này yêu cầu bạn đọc phải có kiến thức về lập trình Thread trong ngôn ngữ Java.

MultiThreading là gì

MultiThreading là khái niệm dùng để nhắc đến những tác vụ chạy song song với nhau và giúp quá trình tương tác của người dùng với ứng dụng không bị gián đoạn. Khi một ứng dụng được start lên sẽ có một Thread được gọi là Main Thread hay UI Thread được chạy. Từ Thread này chúng ta có thể tạo ra những Thread khác để làm những tác vụ chiếm nhiều thời gian. Nếu chúng ta cố tình xử lý những tác vụ này trên UI Thread mà không tạo ra Thread khác có thể dẫn tới làm đơ UI và crash ứng dụng.

Những trường hợp nên sử dụng MultiThreading.

  •  Thao tác với hệ thống mạng (network).
  •  Đọc, ghi file.

Hình ảnh mô phòng MultiThreading.

MultiThreading trong Android

Trong Android, khi chúng ta tạo một Thread để xử lý một tác vụ nào đó trong phương thức run() và gọi phương thức start() để chạy tác vụ này. Thì trong phương thức run chúng ta không được update các giá trị trực tiếp lên UI mà phải gửi message về UI Thread để UI Thread update các giá trị đó lên UI. Nếu bạn cố tình thì sẽ application sẽ ném ra một ngoại lệ.

Mô hình làm việc MultiThreading trong Android.

Để hổ trợ người dùng lập trình multithreading dễ dàng và nhanh gọn. Google giới thiệu cho chúng ta một class dùng để đáp ứng công việc này đó là AsyncTask.

Sử dụng AsyncTask trong Android

Class AsyncTask có các phương thức chính như sau:

onPreExecute

Là phương thức được chạy đầu tiên khi task được bắt đầu. Phương thức này làm việc trên UI Thread.

doInBackground

Là phương thức chạy background thực hiện tác vụ nào đó. Phương thức này chạy trên Background Thread vì thế chúng ta không được update giá trị lên UI trong phương thức này.

onPostExecute

Là phương thức được gọi ngay sau khi phương thức doInBackground kết thúc. Đối số của phương thức này chính là kết quả return từ phương thức doInBackground. Phương thức này làm việc trên UI Thread.

Mô hình làm việc.

Ngoài 3 phương thức chính trên còn có 2 phương thức nữa đó là:

publishProgress

Được sử dụng trong phương thức doInBackground để cập nhật quá trình làm việc lúc runtime và gọi phương thức onProgressUpdate trên UI Thread để update giá trị trong khi doInBackground vẫn làm việc.

onProgressUpdate

Update giá trị lên UI, được gọi nếu phương thức publishProgress được gọi trong phương thức doInBackground. Phương thức này làm việc trên UI Thread.

Ba đối số mà khi chúng ta tạo class extends từ AsyncTask là:

Param

Là kiểu của đối số được truyền vào phương thức doInBackground.

Progress

Là kiểu biến dùng để update giá trị trong quá tình doInBackground chạy. Giá trị này được truyền vào phương thức onProgressUpdate.

Result

Là kiểu trả về của phương thức doInBackground và là kiểu của đối số của phương thức onPostExcute.

Dễ hiểu hơn ta có hình ảnh giải thích chi tiết.

multithreading_android_3

Ví dụ demo

Ví dụ tôi có một ứng dụng sẽ update giá trị từ 0 đến 100000 lên progressbar sau khi người dùng nhất button Start.

File xml định nghĩa layout.

Class UpdateProgressBarTask.

Để sử dụng UpdateProgressBarTask ta tạo một thể hiện của nó và gọi phương thức excute và truyền đối số phù hợp để chạy task.

Ở đây khi người dùng nhấn vào Button thì tôi cho Task bắt đầu chạy.

Source MainActivity.java

Các bạn có thể download source ở đây

Một ví dụ nữa về AsyncTask có nhiệm vụ download hình ảnh và hiển thị lên ImageView

Hay Async Task download nội dung của trang web.

Và nhớ rằng mọi thao tác thông qua network phải cấp quyền INTERNET trong manifest.xml

Lời kết

Trên đây chúng ta đã cùng nhau tìm hiểu lập trình multithreading cũng như cách lập trình với AsyncTask trong Android. Nếu có bất cứ thắc mắc hay khó khăn nào các bạn có thể để lại lời nhắn dưới phần bình luận hoặc liện hệ với fanpage Eitguide Android để được giải đáp.

Advertisements

Về haipro912
Đời rất dở nhưng anh vẫn phải niềm nở =))

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s

%d bloggers like this: