Android第三章
>事件處理的概述
- 兩種事件處理機(jī)制
- 基于監(jiān)聽的事件處理
- 基于回調(diào)的事件處理
>基于監(jiān)聽的事件處理機(jī)制
-
涉及到的三類對象
- Event Source事件源,指各個組件。
- Event 界面組件上發(fā)生的特定的事情,。
- Event Listener監(jiān)聽事件源發(fā)生的事情。并對各種事情作出相應(yīng)的響應(yīng)。
- Event Handler事件處理器,當(dāng)事件監(jiān)聽器捕獲事件后,由響應(yīng)的事件處理器識別特定的事件,并做出響應(yīng)的動作。
-
事件監(jiān)聽機(jī)制的工作流程
普通組件(事件源對象) 發(fā)生很多事件,生成多種事件對象 被同一個監(jiān)聽器對象捕獲 監(jiān)聽器通過不同的事件處理器處理這個事件。每個組件可以根據(jù)不同的事件類別指定多個監(jiān)聽器,每一個監(jiān)聽器可以監(jiān)聽多個事件源。
>實(shí)現(xiàn)事件監(jiān)聽器的方法
- 內(nèi)部類作為時間的監(jiān)聽器
使用內(nèi)部類作為事件監(jiān)聽器能夠在這個類內(nèi)復(fù)用該監(jiān)聽器。該監(jiān)聽器類能夠自由訪問外部類的所有界面組件 - 外部類作為時間監(jiān)聽器
事件監(jiān)聽器通常屬于特定的GUI界面,定義成外部類不利于提高程序的內(nèi)聚性。外部類形式的時間監(jiān)聽器不能夠自由訪問GUI界面的類中的組件。同時也適用于監(jiān)聽器于GUI界面沒有任何耦合情況。監(jiān)聽器還是主要來寫顯示邏輯,具體的業(yè)務(wù)邏輯放到外部的其他函數(shù)或者類中進(jìn)行處理。
- Activity類本身作為事件監(jiān)聽器
不推薦,activity類本身用來界面初始化工作,包含事件監(jiān)聽器容易造成程序的邏輯結(jié)構(gòu)混亂。 - 匿名類作為時間監(jiān)聽器類
大部分時候事件監(jiān)聽器類的代碼沒有什么復(fù)用價值,所以只要使用匿名類來實(shí)現(xiàn)事件監(jiān)聽器想要達(dá)到的頁面邏輯就好。
android可以直接在界面布局中制定標(biāo)簽綁定事件的處理方式。
android:onClick=“clickHandler”
>基于回調(diào)的事件處理方法
- 回調(diào)機(jī)制
事件的處理直接綁定到與組件相關(guān)的時間處理函數(shù)上,而非通過監(jiān)聽器的監(jiān)聽和事件處理器的匹配處理。有點(diǎn)像事件監(jiān)聽器和事件源融合在一起,不需要單獨(dú)的時間監(jiān)聽器類,事件源本身能夠監(jiān)聽自身發(fā)生的各種事件。 - 基于回調(diào)的事件傳播
當(dāng)返回為true時,表明該方法已經(jīng)能夠處理發(fā)生的事件,事件不會向外傳播給外層的時間監(jiān)聽器。當(dāng)返回為false時,如果有外圍的監(jiān)聽器處理同一個事件,則事件會向外傳播,同時被其他監(jiān)聽器堅挺到。如果存在各種監(jiān)聽器,其監(jiān)聽順序?yàn)椋航壎ǖ氖录O(jiān)聽器–>基于回調(diào)的內(nèi)部事件監(jiān)聽器–>基于回調(diào)的外部事件監(jiān)聽器。
>相應(yīng)系統(tǒng)設(shè)置的事件
- 用來獲取系統(tǒng)的配置
- onConfigurationChanged能夠監(jiān)聽相關(guān)的配置改變的事件。
>Handler消息傳遞機(jī)制
-
工作原理
android第一次啟動,主線程負(fù)責(zé)activityUI界面的線程,而且只允許UI線程對主界面進(jìn)行修改,其他新啟動的線程無法對主界面進(jìn)行直接修改,需要使用Handler進(jìn)行消息傳遞。 -
Handler簡介
- 在新啟動的線程中發(fā)送消息
- 在主線程中獲取和處理消息
好像是原來的事件處理機(jī)制變成了消息處理機(jī)制,通過監(jiān)聽消息,處理消息完成一系列動作,同事件處理一樣。
-
Handler涉及的方法
- HandlerMessage()
- hasMessage()
- hasMessages()
- obtainMessage()
- sendEmptyMessage()
- sendEmptyMessageDelayed()
- sendMessage()
- sendMessageDelayed()
-
Handler、Loop、MessageQueue的工作原理
- Message是Handler接受和處理的對象
- Looper每個線程只能有一個Looper,loop方法負(fù)責(zé)讀取MessageQueue中的消息
- MessageQueen消息隊列,采用了先進(jìn)先出的方式管理隊列。
private Looper()
{
mQueue = new MessageQueue();
mRun = true;
mThread = Thread.currentThread();
}
- Looper類的使用方法
- 調(diào)用Looper的prepare方法,創(chuàng)建Looper對象,生成對應(yīng)的MessageQueue來管理事件
- 創(chuàng)建Handler子類,用于發(fā)送本線程的消息。重寫HandlerMessage方法,負(fù)責(zé)處理來自其他線程的消息。
- 調(diào)用Looper的loop方法啟動Looper類
UI線程一般專門用來相應(yīng)用戶的界面操作,而其他的邏輯運(yùn)算和處理都交給其他線程處理主要目的是防止UI線程被阻塞而讓用戶以為界面卡頓。
此時如果UI線程與其他線程的交互方式,就是Handler消息傳遞機(jī)制,同事件監(jiān)聽機(jī)制的邏輯十分相似。
>異步任務(wù)
-
解決新線程不能更新UI主界面的問題的方法文章來源:http://www.zghlxwxcb.cn/news/detail-500916.html
- 使用Handler消息處理機(jī)制
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable,long)
- 異步處理機(jī)制
-
AsyncTask<Params,Progress,Result>異步類文章來源地址http://www.zghlxwxcb.cn/news/detail-500916.html
- 創(chuàng)建AsyncTask的子類,并制定三個參數(shù)的類型。
- 根據(jù)需要實(shí)現(xiàn)下列方法
- dolnBackground()后臺線程即將執(zhí)行的任務(wù),通過調(diào)用publishProgress()更新任務(wù)的執(zhí)行進(jìn)度
- onProgressUpdate()調(diào)用更新任務(wù)進(jìn)度的方法后,會觸發(fā)這個方法
- onPreExecute()方法,執(zhí)行后臺操作前被調(diào)用,完成初始化工作
- onPostExcute()后臺任務(wù)執(zhí)行完成后,調(diào)用這個方法
- 調(diào)用AsyncTask子類的execute方法開始執(zhí)行好事任務(wù)。
到了這里,關(guān)于【Android學(xué)習(xí)筆記】事件監(jiān)聽機(jī)制詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!