2013-03-28 117 views

回答

19

有幾種方法可以更新您的用戶界面,並從UI線程之外修改View,如TextView。 A Handler只是一種方法。

下面是一個示例,它允許單個Handler響應各種類型的請求。

在類級別定義一個簡單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; 
     } 
    } 
}; 

更新在你的函數,這是現在在UI線程一個用戶界面:

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

從你的異步任務中,發送訊息給Handler。有幾種方法可以做到這一點。這可能是最簡單的:

myHandler.sendEmptyMessage(DO_UPDATE_TEXT); 
+3

什麼'Handler類應該是靜態的,否則內存泄漏可能occur'警告? – nmxprime

+1

請找到[** Blog post **](http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html)和這個答案(http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occurrence-incominghandler)以獲得更多關於此的信息 –

+0

我建議在這裏使用weakHandler來避免泄漏。 https://github.com/badoo/android-weak-handler – j2emanue

2

您也可以通過這種方式也更新從後臺線程UI線程:

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); 
        } 
       });