無論是現在所做的專案還是以前的專案中,都會遇見執行緒之間通訊、元件之間通訊,目前統一採用eventbus來做處理,在總結學習eventbus之前,覺得還是需要學習總結一下最初的實現方式,也算是不忘初心吧,這也是今天來學習總結handler訊息機制的乙個原因。
handler機制產生背景
乙個android應用程式被建立的時候都會建立乙個ui主線程,但是有時我們會有一些比較耗時的操作,為了防止阻塞ui主線程,我們會將耗時的操作放到子執行緒中進行處理,處理完之後操作ui,但是android不允許子執行緒操作ui,違背了android單執行緒模型的原則(即 android ui操作並不是執行緒安全的並且這些操作必須在ui執行緒中執行),所以android通過handler訊息機制來實現執行緒之間的通訊。
handler機制主要角色
message:訊息,其中包含了訊息id,訊息處理物件以及處理的資料等,由messagequeue統一列隊,終由handler處理。
handler:處理者,負責message的傳送及處理。使用handler時,需要實現handlemessage(message msg)方法來對特定的message進行處理,例如更新ui等。
messagequeue:訊息佇列,用來存放handler傳送過來的訊息,並按照fifo規則執行。當然,存放message並非實際意義的儲存,而是將message以鍊錶的方式串聯起來的,等待looper的抽取。
looper:訊息幫浦,不斷地從messagequeue中抽取message執行。因此,乙個messagequeue需要乙個looper。
thread:執行緒,負責排程整個訊息迴圈,即訊息迴圈的執行場所。
handler機制主要運用
1.)傳送訊息,在不同的執行緒間傳送訊息,使用的方法為send***();
sendemptymessage(int);//舉例:主線程定義handler傳送乙個空的訊息
sendmessage(message);//
傳送訊息,訊息中可以攜帶引數
sendmessageattime(message, long);//
未來某一時間點傳送訊息
sendmessagedelayed(message, long);//
延時nms傳送訊息
handler mhandler = new子執行緒發訊息,通知handler完成ui更新handler() }};
private2.)計畫任務,在未來執行某任務,使用的方法為post***();void
getdatafromnet()
}).start();
}
post(runnable);//示例:主線程定義handler提交計畫任務馬上執行
postattime(runnable, long);//
提交計畫任務在未來的時間點執行
postdelayed(runnable, long);//
提交計畫任務延時nms執行
private handler mhandler=new handler();子執行緒提交任務更新ui
privatehandler機制擴充套件void
getdatafromnet()
});}
}).start();
}
為了更加方便的使用handler訊息機制,android也提供了幾種擴充套件方式,內部實現都是基於handler訊息機制
1.)activity.runonuithread(runnable)
private2 .)view.post(runnable)void
getdatafromnet()
});}
}).start();
}
private5.)使用asynctask代替threadvoid
getdatafromnet()
});}
}).start();
}
privatevoid
getdatafromnet()
private
class mytask extends
asynctask
//後台執行緒執行結束後的操作,其中引數result為doinbackground返回的結果
@override
protected
void
onpostexecute(object result)
}
Android訊息傳遞之元件間傳遞訊息
前言 上篇學習總結了android通過handler訊息機制實現了工作執行緒與ui執行緒之間的通訊,今天來學習一下如何實現元件之間的通訊。本文依然是為學習eventbus做鋪墊,有對比才能進步,今天主要介紹在eventbus出現之前的實現方式,通過intent方式這裡不做介紹。需求場景 方式一 通過...
Android 訊息傳遞
在建立handler時,handler在其構造方法中 嘗試從當前執行緒 建立hanlder例項物件的執行緒 的threadlocal中取到looper物件 並將該looper物件賦值給當前hanlder物件,同時還會將looper物件的messagequeue引用賦值給當前handler。publi...
Android 訊息傳遞機制分析
android系統出於系統優化的原因,ui執行緒操作並不是執行緒安全的,這意味著如果多執行緒併發操作ui元件,則可能導致執行緒執行緒安全。所以為了解決這個問題,android制定了一條規則 只允許ui執行緒修改activity裡的ui元件。當乙個程式啟動第一次啟動時,android會同時啟動一條主線...