Test android tes

 





Tạo Handler cho một Thread:

Một Handler được liên kết ngầm với Thread mà tạo ra nó thông qua Looper của Thread, nhưng có thể ràng buộc nó một cách rõ ràng vào một Thread bằng cách truyền looper của Thread vào Constructor của Handler.

handler = new Handler() {
@Override
public void handleMessage(Message msg) {
        // process incoming messages here
        // this will run in the thread, which instantiates it
    }
};

Việc gửi tin nhắn đến MessageQueue qua Handler có thể được thực hiện theo hai cách:

  • Message: Đây là một lớp xác định các phương thức hữu ích khác nhau để xử lý dữ liệu được gửi đi. Để gửi một đối tượng, chúng ta thiết lập biến obj.

    Message msg = new Message();
    msg.obj = "Ali send message";
    handler.sendMessage(msg);
    

    Chi tiết của lớp Message có thể được tìm thấy ở đây: https://developer.android.com/reference/android/os/Message.html

  • Runnable: Một runnable cũng có thể được gửi trong MessageQueue.

    new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
            // this will run in the main thread
        }
    });
    

    Trong ví dụ trên, chúng ta tạo một Handler và cung cấp Looper liên kết đến Main Thread.Khi post Runnable, nó sẽ được xếp vaò hàng đợi trong MessageQueue của Main Thread và sau đó được thực thi trong Main Thread.

    Handler có khả năng xử lý Message theo nhiều cách khác nhau, có thể tìm thấy ở đây: https://developer.android.com/reference/android/os/Handler.html


HandlerThread

Tạo Thread riêng và cung cấp Lopper và MessageQueue không phải là cách phù hợp để giải quyết vấn đề. Vì vậy, Android đã cung cấp HandlerThread (lớp con của Thread) để hợp lý hóa quá trình. Trong đó nó làm những điều tương tự mà chúng ta đã làm nhưng theo một cách mạnh mẽ. Vì vậy,khuyến khích sử dụng HandlerThread.

private class MyHandlerThread extends HandlerThread {

    Handler handler;

    public MyHandlerThread(String name) {
        super(name);
    }

    @Override
    protected void onLooperPrepared() {
        handler = new Handler(getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                // process incoming messages here
                // this will run in non-ui/background thread
            }
        };
    }
}

Lưu ý: Chúng ta đã khởi tạo Handler khi onLooperPrepared() được gọi. Vậy, Handler có thể liên kết với Looper đó.

  • Looper chỉ được chuẩn bị sau khi HandlerThread.start() được gọi(là sau khi thread chạy).
  • Một Handler có thể được liên kết với một HandlerThread, chỉ sau khi Looper được chuẩn bị.

Cách khác để tạo HandlerThread:

HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());

Lưu ý: HandlerThread cần gọi myHandlerThread.quit() để giải phóng tài nguyên và ngừng thực thi Thread.


Trên đây là bài giới thiệu của mình về Handler, Looper và HandlerThread. Hi vọng có thể giúp các bạn hiểu và giả quyết vấn đề của mình.



Đăng nhận xét

Mới hơn Cũ hơn