2013-03-28 26 views
7

Tôi muốn cập nhật một TextView từ tác vụ không đồng bộ trong ứng dụng Android. Cách đơn giản nhất để thực hiện việc này với Handler là gì?Làm cách nào để sử dụng Trình xử lý Android để cập nhật một TextView trong Giao diện người dùng?

Có một số câu hỏi tương tự, chẳng hạn như: Android update TextView with Handler, nhưng ví dụ này phức tạp và có vẻ như không được trả lời.

Trả lời

19

Có một số cách để cập nhật giao diện người dùng của bạn và sửa đổi View chẳng hạn như TextView từ bên ngoài Chủ đề giao diện người dùng. A Handler chỉ là một phương pháp.

Dưới đây là ví dụ cho phép một đơn Handler trả lời các loại yêu cầu khác nhau.

Ở cấp lớp định nghĩa một đơn giản Handler:

private final static int DO_UPDATE_TEXT = 0; 
private final static int DO_THAT = 1; 
private final Handler myHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     final int what = msg.what; 
     switch(what) { 
     case DO_UPDATE_TEXT: doUpdate(); break; 
     case DO_THAT: doThat(); break; 
     } 
    } 
}; 

Cập nhật giao diện người dùng trong một trong những chức năng của mình, mà bây giờ trên UI Thread:

private void doUpdate() { 
    myTextView.setText("I've been updated."); 
} 

Từ bên trong nhiệm vụ không đồng bộ của bạn, gửi tin nhắn đến Handler. Có một số cách để làm điều đó. Đây có thể là đơn giản nhất:

myHandler.sendEmptyMessage(DO_UPDATE_TEXT); 
+3

gì về 'Handler lớp nên tĩnh khác rò rỉ bộ nhớ có thể occur' cảnh báo? – nmxprime

+1

vui lòng tìm [** bài đăng blog **] (http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html) và câu trả lời này (http://stackoverflow.com/question/11407943/this-handler-class-should-be-static-hoặc-leaks-có thể-xảy ra-incominghandler) để có được cái nhìn sâu sắc hơn về điều này –

+0

tôi khuyên bạn nên weakHandler ở đây để tránh rò rỉ. https://github.com/badoo/android-weak-handler – j2emanue

2

Bạn cũng có thể cập nhật thread UI từ sợi nền theo cách này cũng:

Handler handler = new Handler(); // write in onCreate function 

//below piece of code is written in function of class that extends from AsyncTask 

handler.post(new Runnable() { 
        @Override 
        public void run() { 
         textView.setText(stringBuilder); 
        } 
       }); 
Các vấn đề liên quan