aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Handler.removeCallbacks: giữ đúng Runnable để hủy tác vụ chờ

Suong Nguyen by Suong Nguyen
12/11/2026
in Lập trình Mobile
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Bạn lên lịch đổi nhãn sau một giây rồi muốn hủy khi người dùng bấm nút. Hai lambda chứa cùng câu lệnh trông giống nhau, nhưng việc tạo một Runnable mới lúc hủy không thay thế tham chiếu đã dùng khi đặt lịch. Cách dễ review là giữ callback trong một biến và dùng biến đó cho cả hai thao tác.

Tách callback khỏi hai nút

Ví dụ sau là đoạn tích hợp trong Activity Kotlin có TextView tên statusView và hai nút scheduleButton, cancelButton đã được gán. Thêm đoạn này vào bước gắn listener sau khi View đã tồn tại. Các nút gọi trên main thread; tác vụ chỉ đổi nhãn và không thực hiện I/O.

val handler = Handler(Looper.getMainLooper())
val showResult = Runnable {
    statusView.text = "Đã chạy"
}

scheduleButton.setOnClickListener {
    handler.removeCallbacks(showResult)
    val queued = handler.postDelayed(showResult, 1000L)
    statusView.text = if (queued) "Đang chờ" else "Không xếp được"
}

cancelButton.setOnClickListener {
    handler.removeCallbacks(showResult)
    statusView.text = "Đã yêu cầu hủy"
}

Import Handler và Looper từ android.os. Lệnh remove trước khi post khiến bấm đặt lịch lần nữa thay thế callback còn chờ. Giá trị trả về từ postDelayed cho biết có xếp được việc hay không. Nó không cho biết dòng đổi nhãn đã chạy. Nhãn trên nút hủy dùng chữ “yêu cầu” vì hàm hủy không trả số callback bị loại.

Phạm vi hủy

Tài liệu Android mô tả removeCallbacks với Runnable từ API level 1. Nó loại các lần đăng callback tương ứng còn chờ trong queue của Handler đó. Không dùng nó để dừng một hàm đã bắt đầu chạy hoặc một request mạng đã được hàm khởi tạo. Công việc bất đồng bộ cần cơ chế hủy và xử lý kết quả đến muộn của riêng nó.

Đừng gọi removeCallbacksAndMessages với null trên một Handler dùng chung chỉ để hủy một nhãn. Phạm vi của thao tác đó rộng hơn callback đang xét. Nếu callback giữ tham chiếu View, lưu cùng tham chiếu ở nơi sở hữu vòng đời và dọn nó khi View không còn dùng được. Trong Fragment, hãy chọn vòng đời View thay vì giả định mọi View sống đến lúc Fragment bị hủy.

Kiểm tra trên dự án

Thử đặt lịch rồi hủy ngay: nhãn không nên chuyển thành “Đã chạy” từ lần chờ đó. Thử đặt hai lần cách nhau ngắn để kiểm tra lượt trước được thay thế. Sau đó để một lần chạy xong rồi bấm hủy, nhằm phân biệt hủy phần còn chờ với hoàn tác kết quả. Lặp lại khi rời màn hình và kiểm tra dọn callback tại đúng vòng đời.

Đây là kế hoạch kiểm tra theo API được đọc ngày 12/11/2026; chưa biên dịch Kotlin, chạy Android SDK hoặc đo thời gian trên thiết bị. Một giây là cấu hình demo, không phải cam kết thời điểm chính xác.

Kết luận

Giữ đúng Runnable, dùng cùng Handler và chỉ kỳ vọng hủy việc còn chờ. Xử lý vòng đời và công việc đã bắt đầu bằng cơ chế phù hợp với từng loại tác vụ.

Nguồn tham khảo

  • Android Handler: postDelayed và removeCallbacks

Tags: AndroidHandlerKotlin
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android TextUtils.isEmpty không loại chuỗi toàn khoảng trắng

by Suong Nguyen
11/11/2026
0

Phân biệt null, chuỗi rỗng và chuỗi blank khi kiểm tra tên nhập từ EditText, rồi chọn quy tắc Kotlin phù hợp.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android runOnUiThread và Handler.post: chạy ngay hay đưa vào hàng đợi?

by Suong Nguyen
10/11/2026
0

Đọc đúng thứ tự callback khi gọi runOnUiThread từ main thread và phân biệt với Handler.post gắn vào main Looper.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android CheckBox: đổi isChecked bằng code vẫn có thể gọi listener

by Suong Nguyen
09/11/2026
0

Phân biệt sự kiện đổi trạng thái với thao tác bấm của người dùng khi dùng CheckBox và OnCheckedChangeListener trong Android Views.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android TextView.setText(Int): số đếm có thể bị hiểu thành resource ID

by Suong Nguyen
08/11/2026
0

Phân biệt overload setText nhận resource ID với overload nhận nội dung để hiển thị số đếm mà không gọi nhầm tài nguyên chuỗi.

Next Post
Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Map.get trả undefined: khóa không tồn tại hay đã lưu giá trị undefined?

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native Keyboard.dismiss: đóng bàn phím mà vẫn giữ bản nháp
  • Map.get trả undefined: khóa không tồn tại hay đã lưu giá trị undefined?
  • Handler.removeCallbacks: giữ đúng Runnable để hủy tác vụ chờ

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply