Android中主線程一直檢視訊息為什麼不會卡死

2021-09-10 01:51:28 字數 3318 閱讀 8186

首先簡單介紹以下handler的機制

message

handler主要用於傳送和處理訊息。傳送訊息一般使用handler的sendmessage()方法,傳送的訊息最終傳遞到handler的handlemessage()方法中。

messagequeue

messagequeue為訊息佇列,主要用於存放所有通過handler傳送的訊息。訊息儲存於訊息佇列中等待被處理。每個執行緒中只有乙個messagequeue物件。

looper

looper是每個執行緒的messagequeue的管家,呼叫looper的loop()方法之後,會進入乙個無限迴圈中,每當發現messagequeue中存在一條等待處理的訊息,就會將它取出,傳遞到handler的handlemessage()方法中。每個執行緒中只有乙個looper物件。

非同步處理訊息流程:

1.在主線程中建立乙個handler物件,並重寫handlemessage方法。

2.子執行緒建立乙個message物件,通過handler將這條訊息傳送出去(呼叫sendmessage()方法)。

3.訊息被新增到messagequeue的佇列中等待處理,looper一直嘗試從messagequeue取出等待處理的訊息,交給handler的handlemessage()方法中。

處理訊息的時候使用了looper.loop()方法,該方法被主線程呼叫,且該方法中存在乙個死迴圈在遍歷訊息佇列取訊息,為什麼沒有被阻塞呢?

public static final void main(string args)
looper.loop()方法:

public static final void loop()

...}

2.activitythread並不是乙個執行緒,只是乙個final類,主線程就從這個類的main方法開始。裡面就有呼叫looper的loop方法。

3.看看下面handlemessage的**:

activitythread有乙個gethandler方法,得到handler可以傳送訊息;

然後loop分發訊息,發給handler;

然後執行handler中的對應**。

有訊息過來才可以執行所以不會發生卡死

public void handlemessage(message msg)  break;

case relaunch_activity: break;

case pause_activity:

trace.tracebegin(trace.trace_tag_activity_manager, "activitypause");

handlepauseactivity((ibinder)msg.obj, false, (msg.arg1&1) != 0, msg.arg2,

(msg.arg1&2) != 0);

maybesnapshot();

trace.traceend(trace.trace_tag_activity_manager);

break;

case pause_activity_finishing:

trace.tracebegin(trace.trace_tag_activity_manager, "activitypause");

handlepauseactivity((ibinder)msg.obj, true, (msg.arg1&1) != 0, msg.arg2,

(msg.arg1&1) != 0);

trace.traceend(trace.trace_tag_activity_manager);

break;

case stop_activity_show:

trace.tracebegin(trace.trace_tag_activity_manager, "activitystop");

handlestopactivity((ibinder)msg.obj, true, msg.arg2);

trace.traceend(trace.trace_tag_activity_manager);

break;

case stop_activity_hide:

trace.tracebegin(trace.trace_tag_activity_manager, "activitystop");

handlestopactivity((ibinder)msg.obj, false, msg.arg2);

trace.traceend(trace.trace_tag_activity_manager);

break;

case show_window:

trace.tracebegin(trace.trace_tag_activity_manager, "activityshowwindow");

handlewindowvisibility((ibinder)msg.obj, true);

trace.traceend(trace.trace_tag_activity_manager);

break;

case hide_window:

trace.tracebegin(trace.trace_tag_activity_manager, "activityhidewindow");

handlewindowvisibility((ibinder)msg.obj, false);

trace.traceend(trace.trace_tag_activity_manager);

break;

case resume_activity:

trace.tracebegin(trace.trace_tag_activity_manager, "activityresume");

handleresumeactivity((ibinder) msg.obj, true, msg.arg1 != 0, true);

trace.traceend(trace.trace_tag_activity_manager);

break;

case send_result:

trace.tracebegin(trace.trace_tag_activity_manager, "activitydeliverresult");

handlesendresult((resultdata)msg.obj);

trace.traceend(trace.trace_tag_activity_manager);

break;

}

虛幻4 主線程一直向渲染執行緒傳送Task

program engine updating engine source runtime launch private launch.cpp while gisrequestingexit engine updating engine source runtime renderer private...

python多執行緒爬蟲時,主線程一直等待錯誤。

1 抓取 的 資訊時,遇到了加上守護執行緒 程式執行完主線程,唰的一下就結束了,子執行緒在 嗯,丟掉了 t.setdaemon true 設定守護執行緒把上邊那句注釋掉後,子執行緒 emmmmm 執行了,然後就一直在等待 等乙個不知道是誰的誰。然後就注釋掉下邊那段話 for q in self.ur...

Android手機剩餘記憶體一直很小

用過android手機的人會感覺到乙個疑惑,開啟任務管理器,一系列的程序。你可能會覺得自己明明把應用程式都退出了,為何程序一直存在,為何會突然冒出自己根本就沒有使用過的應用的程序,為何系統剩餘記憶體一直很小,難道是記憶體不夠用?其實,這個是跟android系統的記憶體管理機制有關。android把這...