2015-08-01 38 views
12

Ai đó có thể cho tôi biết sự khác biệt giữa Chủ đề và Trình xử lý? Khi chúng ta sử dụng Thread và khi chúng ta sử dụng Handler?Sự khác biệt giữa Chủ đề và Trình xử lý

Tôi có hai mã trong dự án của mình, nhưng tôi không thể hiểu chúng.

final Handler handler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     // Do SomeThings 
    } 
}; 

private class readThread extends Thread 
{ 
    Handler mHandler; 

    readThread(Handler h){ 
     mHandler = h; 
     this.setPriority(Thread.MIN_PRIORITY); 

    } 

    @Override 
    public void run() 
    { 
     // Do SomeThings 
    } 
} 

Và trong phương pháp khác gọi là xử lý như thế này

read_thread = new readThread(handler); 
      read_thread.start(); 

Cái nào chạy đầu tiên ?? Ai đó có thể giải thích cho tôi?

+0

bạn không sử dụng trường mHandler trong readThread vì vậy nó là gì? – pskink

+0

Tôi không biết. Tôi không biết gì về những mã này. Tôi đang cố gắng để unedrestand họ – Khodayar

Trả lời

21

Cùng: bạn có thể vừa thực hiện nhiệm vụ không đồng bộ mà không chặn mã hiện tại của bạn,

Sự khác biệt: Hãy tưởng tượng bạn có một Runnable r = new Runnable{...}

  • Khi bạn sử dụng new Thread(r).start(), bạn thực sự tạo một chuỗi mới một tác vụ chạy không đồng bộ.

  • Khi bạn sử dụng new Handler().post(r) (hoặc Message), bạn đã thêm đối tượng Runnable vào Looper và thực thi mã sau trong cùng một chuỗi.

Một Thread, thường MainThread hay UIThread chứa một Looper. Khi MainThread chạy, nó sẽ lặp lại các Looper và thực hiện Runnable từng cái một.

Khi Chủ đề được ưa thích:

Khi bạn đang làm một công việc nặng nhọc như giao tiếp mạng, hoặc giải mã các tập tin bitmap lớn, một chủ đề mới được ưa thích. Nếu cần nhiều chủ đề, có thể cần thêm ExecutorService. https://developer.android.com/reference/java/util/concurrent/ExecutorService.html

Khi Handler được ưa thích:

Khi muốn của bạn để cập nhật đối tượng giao diện người dùng (như TextView 's văn bản) từ chủ đề khác, nó là cần thiết rằng giao diện người dùng đồ vật chỉ có thể được cập nhật trong UI Chủ đề. Ngoài ra, khi bạn chỉ muốn chạy một số mã ánh sáng sau (như độ trễ 300ms), bạn có thể sử dụng Handler vì nó nhẹ hơn và nhanh hơn.

Hãy cũng tham khảo: Handler vs AsyncTask vs Thread

3

Chủ đề là nhiệm vụ xử lý chung có thể làm hầu hết mọi thứ, nhưng có một điều họ không thể làm là cập nhật giao diện người dùng.

Trình xử lý mặt khác là các chủ đề nền cho phép bạn giao tiếp với chuỗi giao diện người dùng (cập nhật giao diện người dùng).

Vì vậy, ví dụ hiển thị bánh mì nướng hoặc cập nhật thanh tiến trình qua một tin nhắn (Runnable) được gửi tới trình xử lý nhưng bạn không thể nếu bạn bắt đầu chuỗi này dưới dạng chuỗi.

Với trình xử lý, bạn cũng có thể có những thứ như MessageQueuing, lập lịch và lặp lại.

Tôi chưa gặp phải tình huống mà tôi cần một chuỗi trong Android.

Tôi chủ yếu sử dụng kết hợp AsyncTask và Trình xử lý.

Trình xử lý cho các tác vụ nói trên.

AsyncTasks để tải về/dữ liệu quyến rũ và bỏ phiếu, vv

1

Thread thực sự tạo chủ đề mới - một phần của công việc chạy ở chế độ nền tương đối để thread hiện hành.

Handler chính nó không cung cấp bất kỳ cơ chế nào cho công việc nền - nó chỉ là công cụ truy cập hàng đợi tin nhắn (Looper) được liên kết với một số chuỗi. Chuỗi giao diện người dùng có Looper được đính kèm theo mặc định, vì vậy thực tế phổ biến là cập nhật giao diện người dùng với Handler.post(Runable) có nghĩa là thực hiện một số đoạn mã trên chuỗi được liên kết với số Handler này.
Ngay sau Handler phục vụ Looper, bạn không thể tạo nó trong chuỗi không có liên kết Looper.

Các vấn đề liên quan