Android中Handler與Message的基礎應用(子線程中更新UI)

零、

零點1、寫在前面

在Android中,關於UI的管理是在主線程中進行的。但咱們常常遇到須要在子線程中更新UI的狀況,因此可使用Handler與Message來完成。ide

1、Handler與Message

Handler在主線程中,負責處理消息,Message能夠在子線程中發送消息。因此子線程中更新UI的思路就是:在子線程中發送Message,由Handler接受處理,而Handler在主線程中,因此能夠更新UI。this

2、設置Handler

兩種方法:一、實例化一個Handler對象並重載handleMessage方法。二、定義本身的Handler類繼承自Handler並重寫handleMessage方法。spa

Show me the code線程

private Handler mHandler = new Handler(){
    public void handleMessag(Message mes){
        super.handleMessage(mes);
        //這裏作你想作,隨心所欲
        switch(mes.what){//我在這裏經過判斷mes的類型作不一樣的操做。
            case 0:{
                String text = (String) mes.obj;
                Toast.makeText(MainActivity.this,text,Toast.LENGTH_LONG);break;
            }
                
            default:break;
        }
    }
};
複製代碼

固然,你在Android Studio中寫下這段代碼,會報一個警告,咱們以後再說翻譯

3、經過Message發送消息

在須要發送消息的地方咱們實例化Message對象並設置好參數就能夠發送了。code

Code警告cdn

Message mes = new Message();
mes.what = 0;
mes.obj = text;//text就是你想要傳遞的參數
handler.sendMessage(mes);
複製代碼

Message中還有其餘實用的方法,例如void setData(Bundle data),能夠在message中傳遞bundle,能夠說是很負責了。對象

4、還記得關於Handler的警告麼?

//警告雖然能夠忽略,可是可能會形成意想不到的後果。但願你們之後也要注意處理一下警告。blog

首先咱們來看一下警告的內容排序

This Handler class should be static or leaks might occur

以後還有具體的警告信息。總之這條警告的大概意思是:因爲這個Handler class 被聲明爲內部類,因此可能會引發內存泄漏,應該聲明爲static。

關於內存泄漏的解釋,我用萌新語翻譯一下就是:咱們這麼寫,未來內存泄漏出現誤差,咱們要負責任的。嗯..其實這樣說的,Handler在主線程中,咱們要是想退出MainActivity,可是Handler萬一還在等着消息呢,Android又不忍心傷害一個在家中苦苦等待本身在外工做的老公的Handler的心,因此說MainActivity我去買幾個橘子,你就在內存中等罷不要onDestroy。後果呢,就是可能內存泄漏了。

但其實關於這個警告,Android Framework 的工程師 Romain Guy早已經給出了本身的建議寫法。咱們來看看:

private static class MyHandler extends  Handler{
    private final WeakReference<MainActivity> mActicity;
    public MyHandler(MainActivity activity){
        mActicity = new WeakReference<MainActivity>(activity);
    }
    @Override
    public void handleMessage(Message mes){
        super.handleMessage(mes);
        MainActivity activity = mActicity.get();
        if(activity != null){
            switch (mes.what){
                case 0:
                    String text = (String) mes.obj;
                    Toast.makeText(MainActivity.this,text,Toast.LENGTH_LONG);break;
                default:break;
            }
        }
    }
}
複製代碼

官方解決,O了個冒泡排序K。

//做爲Android開發的初學者,若是我有錯誤的地方或者不足的話歡迎你們指正。

相關文章
相關標籤/搜索