2013-02-28 37 views
40

Tôi đang tự hỏi khi nào tôi nên sử dụng handler.post(runnable); và khi nào tôi nên sử dụng new Thread(runnable).start();Khi sử dụng handler.post() & khi chủ đề mới()

Nó được đề cập trong tài liệu hướng dẫn các nhà phát triển cho Handler:

Làm cho r Runnable được thêm vào hàng đợi thư. Các runnable sẽ được chạy trên thread mà bộ xử lý này được đính kèm.

Điều này có nghĩa nếu tôi viết trong onCreate() của Activity lớp:

Handler handler = new Handler(); 
handler.post(runnable); 

sau đó Runnable sẽ được gọi trong một thread riêng biệt hoặc trong chủ đề của Hoạt động?

Trả lời

64

Bạn nên sử dụng Handler.post() bất cứ khi nào bạn muốn thực hiện các thao tác trong chuỗi giao diện người dùng.

Vì vậy, giả sử trong cuộc gọi lại (đang chạy trong chuỗi riêng) bạn muốn thay đổi văn bản TextView, bạn nên sử dụng Handler.post().

Trong Android, giống như trong nhiều khung giao diện người dùng khác, các phần tử giao diện người dùng (widget) chỉ có thể được sửa đổi từ chuỗi chính.


Edit: các ví dụ về nhiệm vụ kéo dài

mHandler = new Handler(); 

new Thread(new Runnable() { 
    @Override 
    public void run() { 
    // Perform long-running task here 
    // (like audio buffering). 
    // you may want to update some progress 
    // bar every second, so use handler: 
    mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     // make operation on UI - on example 
     // on progress bar. 
    } 
    }); 
    } 
}).start(); 

Tất nhiên, nếu công việc bạn muốn thực hiện là rất dài và có một rủi ro mà người dùng có thể chuyển sang một số ứng dụng khác trong thời gian chờ đợi, bạn nên cân nhắc sử dụng Service.

+0

Nhưng nếu nói tôi muốn đệm luồng âm thanh từ internet. Tôi có nên làm điều đó thông qua handler.post hoặc theo chủ đề mới? – reiley

+1

Thực sự phụ thuộc vào yêu cầu của bạn. Tôi sẽ xem xét một luồng mới hoặc một Dịch vụ. Tôi sẽ cập nhật câu trả lời bằng ví dụ sau giây lát. – kamituel

11

Ví dụ được jacked:

mHandler = new Handler(); 
new Thread(new Runnable(){ 
    @Override 
    public void run() { 
    mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     mUiView.setX(x); 
    } 
    }); 
    } 
}).start(); 

Hoặc bạn có thể bỏ qua xử lý và sử dụng phương pháp bài trên xem trực tiếp:

new Thread(new Runnable(){ 
    @Override 
    public void run() { 
    mUiView.post(new Runnable() { 
    @Override 
    public void run() { 
     mUiView.setX(x); 
    } 
    }); 
    } 
}).start(); 

Đây là một bài tốt mà vạch ra sự khác biệt: What exactly does the post method do?

18

Để trả lời cho bạn câu hỏi cụ thể:

Điều này có nghĩa là nếu trong lớp onCreate of Activity tôi viết:

Xử lý xử lý = new Handler() hanlder.post (runnable); sau đó, runnable sẽ được gọi trong một chuỗi riêng biệt hoặc trên luồng của Hoạt động?

Sẽ không có. Runnable sẽ được gọi trên chính Main Thread. Trình xử lý đơn giản được sử dụng để đăng một tin nhắn đến chủ đề mà nó được đính kèm (nơi nó được tạo). Nó không tự tạo một chủ đề. Trong ví dụ của bạn, bạn đã tạo một Trình xử lý trong Chủ đề chính (nơi mà Activity.OnCreate() được gọi) và do đó bất kỳ thông báo nào được đăng trên Trình xử lý như vậy sẽ chỉ chạy trên Chủ đề chính.

+3

Câu trả lời đúng không phải lúc nào cũng được chọn là tốt nhất. Cảm ơn –

+0

Bạn vừa thay đổi hoàn toàn các ứng dụng của tôi !! Chuyển từ trình xử lý sang chuỗi chỉ khiến ứng dụng của tôi bay! Vì vậy, nhờ người đàn ông lớn !! – Mitchapp

2

sử dụng handler.post() khi bạn muốn bài(thường là từ chủ đề nền) đến chủ đề chính. Yea, POST, giống như bạn, đăng một bức thư cho ai đó. Với sự trợ giúp của bộ xử lý , mã sẽ được thực thi càng sớm càng tốt, tức là gần như ngay lập tức.

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