Hôm nay mình sẽ chỉ cho bạn cách làm thế nào để khai thác các tiện ích từ Handler trong Android hiệu quả. Khi khám phá ra những tính năng vô cùng tuyệt vời này của Handlers. Mình đã thật ngạc nhiên khi biết rằng chúng thật tiện dụng và dễ sử dụng.
Nội dung chính của bài viết
Handler là gì?
Đầu tiên, Handlers không phải là một khái niệm mới, chúng đã có từ rất lâu. Cụ thể là bao lâu? Theo mình được biết thì là từ thời API level 1 rồi. Mặc dù vậy, mình vẫn luôn cảm thấy các bạn vẫn chưa thực sự khai thác triệt để, kể cả mình cũng vậy ^^.
Có thể hiểu Handler là một class khi khai báo trong ứng dụng nó sẽ có chức năng giống với “listener” của các control khác trên màn hình. Điểm khác biệt là các control khác thì lắng nghe “onKey”, “onClick” còn Handlers thì là handleMessage.
Vậy, một Handler có thể làm gì?
- Sắp xếp và xử lý các messages
- Sắp xếp và thực hiện các Runnables
- Có thể chạy trên một Thread khác nơi mà Handler được tạo ra
- Có thể tái sử dụng nhiều lần khi cần
Tìm hiểu cách sử dụng Handler trong Android
Handler trong android có một hạn chế là “sự không rõ ràng”. Nó không phải là một Runnable, mà cũng không phải là Thread
Bạn có thể xem Handler như là một cơ chế cao cấp để xử lý hàng đợi. Việc hàng đợi này chứa Messages hay Runnables, hay việc chúng nên được xử lý trên main thread hay các background thread không quan trọng.
Handler vẫn sẽ được tạo ra để xử lý đống Messages này, từng cái một. Và đây chính là điều cần phải nhớ.
Một ví dụ điển hình của việc sử dụng Handler: khi bạn có một Runnable và bạn làm gì đó với background android thread. Và đến một lúc – bạn muốn cập nhật dữ liệu lên UI.
Trong trường hợp này, bạn hãy gán giá trị cần cập nhật cho Handler bằng cú pháp new Handler(Looper.getMainLooper)
. Sau đó gọi handler.post()
thực hiện công việc của UI bên trong post()
. Thật tuyệt phải không nào?
private void postTaskInsideBackgroundTask() { Thread backgroundThread = new Thread(new Runnable() { @Override public void run() { // pretend to do something "background-y" try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } mainThreadHandler.post(new Runnable() { @Override public void run() { tv04.setText("Hi from a Handler inside of a background Thread!"); } }); } }); backgroundThread.start(); }
Chúng ta đều biết rằng, một AsyncTask chỉ có thể được thực hiện một lần. Điều này không xảy ra với Handlers.
Thậm chí có một lớp đặc biệt có thể xử lý một vài các Handlers cùng lúc đó là HandlerThread.
HandlerThread có thể thay phiên xử lý cho cả Looper, một cách tự động. Vì vậy bạn không cần phải lo lắng về điều này.
Để cho bạn thấy được sự khác nhau giữa Handler, Thread và Runnable. Mình đã tạo ra một dự án ví dụ với cách sử dụng Handler khác nhau. Bạn download ở link bên dưới nhé
Cuối cùng
Trong dự án example này, mình đã cố gắng comment rất chi tiết từng hàm để bạn có thể đọc hiểu dễ dàng. Hãy chạy code này và trải nghiệm thử Handler đi nhé, nó rất đáng để thử đó!
bookmarked!!, I like your blog!
Thanks so much
Thanks for share