Thread, Asynctask, Handler Trong Android

Thread, Asynctask, Handler trong Android

Bài này chúng ta sẽ cùng tìm hiểu về các khái niệm, cấu trúc và cách sử dụng Thread, Asynctask, Handler trong  lập trình Android.

Lập trình Android - Đa luồng

I. Thread

  • Khái niệm
  • Thread là một tiến trình đơn vị xử lý của máy tính có thể thực hiện một công việc riêng biệt.
  • Multi-thread là khái niệm cho nhiều tiến trình chạy đồng thời. Một ứng dụng Java ngoài luồng chính có thể có các luồng khác thực thi đồng thời làm ứng dụng chạy nhanh và hiệu quả hơn.
  • Ưu điểm của đa luồng
  • Mỗi luồng có thể dùng chung và chia sẻ nguồn tài nguyên trong quá trình chạy, nhưng có thể thực hiện một cách độc lập.
  • Ứng dụng trách nhiệm có thể được tách + Luồng chính chạy giao diện người dung + Các luồng phụ nhiệm gửi đến luồng chính. 
  • Nhược điểm của đa luồng:
  • Càng nhiều luồng thì xử lý càng phức tạp
  • Cần phát hiện tránh các luồng chết, luồng chạy mà không làm gì trong ứng dụng cả

Thread th = new Thread(new Runnable() {     @Override     public void run() {

        runOnUiThread(new Runnable() {             @Override             public void run() {

            }         });     } }); th.start();

II. AsyncTask

  • Khái niệm
  • 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).
  • Cấu trúc
  • AsyncTask<Params, Progress, Result>  có 3 đối số là các Generic Type:
  • Params: Là giá trị ((biến) được truyền vào khi gọi thực thi tiến trình và nó sẽ  được truyền vào doInBackground
  • Progress: Là  giá trị (biến) dùng để update giao diện diện lúc tiến trình thực thi, biến này sẽ được truyền vào hàm onProgressUpdate.
  • Result: Là biến dùng để lưu trữ kết quả trả về sau khi tiến trình thực hiện xong.
  • Những đối số nào không sử dụng trong quá trình thực thi tiến trình thì ta thay bằng Void.
  • Thông thường trong 1 AsyncTask sẽ chứa 4 hàm
  • onPreExecute() :Tự động được gọi đầu tiên khi tiến trình được kích hoạt.
  • doInBackground(): Được thực thi trong quá trình tiến trình chạy nền, thông qua hàm này để ta gọi hàm onProgressUpdate để cập nhật giao diện (gọi lệnh publishProgress). Ta không thể cập nhật giao diện trong hàm doInBackground().
  • onProgressUpdate (): Dùng để cập nhật giao diện lúc runtime
  • onPostExecute(): Sau khi tiến trình kết thúc thì hàm này sẽ tự động sảy ra. Ta có thể lấy được kết quả trả về sau khi thực hiện tiến trình kết thúc ở đây.
  • Trong 4 hàm trên thì hàm doInBackground() bắt buộc phải tồn tại, còn các hàm khác có thể khuyết, nhưng theo Tui các bạn nên sử dụng đầy đủ 4 hàm đã nêu.
  • Đối với AsyncTask thì ta cần tạo một lớp kế thừa từ AsyncTask, sau đó từ MainActivity ta gọi hàm execute() của tiến trình này là OK.

class A extends AsyncTask<Void,Void,Void>{     @Override     protected void onPreExecute() {

    }

    @Override     protected Void doInBackground(Void… params) {         return null;     }

    @Override     protected void onProgressUpdate(Void… values) {         super.onProgressUpdate(values);     }

    @Override     protected void onPostExecute(Void aVoid) {         super.onPostExecute(aVoid);     } }

III. Handler

  • Khái niệm

Handler() để giao tiếp giữa 2 hay nhiều thread, ngoài ra Handler() còn được sử dụng để xử lý 1 yêu cầu nào của người dùng sau 1 khoảng thời gian nhất định.

// hàm này dùng để nhận thông điệp gửi từ tiến trình con

       handler = new Handler() {          @Override         public void handleMessage(Message msg) {         super.handleMessage(msg);        }      };

//tạo tiến trình con để gửi thông điệp về main thread

Thread th = new Thread(new Runnable() {     @Override     public void run() {         try {

                // lay mesage thu main threa chính Message msg = handler.obtainMessage();                  //gui lai ve main thread handler.sendMessage(msg);

            }         } catch (InterruptedException e) {             e.printStackTrace();         }     } }); th.start();

Chúc các bạn học tốt!

Share this:on social

  • X
  • Facebook
Like Loading...

Related

Từ khóa » đa Luồng Trong Android