一、looper.prepare()
Looper.prepare()是一個Android系統中的關鍵方法之一,在主線程中使用是為了創建消息循環(Message Loop)以便我們在主線程中發送和處理異步消息。在非主線程中使用Looper.prepare()是為了創建一個新的消息隊列,並把它綁定到當前線程中。
調用Looper.prepare()方法將會為當前線程創建一個消息隊列,後續通過Handler的sendMessage()方法發送消息就是將消息插入到這個隊列中。調用Looper.loop()方法則是不斷地從消息隊列中取出消息,然後根據消息的類型分發給相應的Handler進行處理。
一般地,在創建Looper對象之後,接下來要調用Looper.prepare()方法,以便為這個Looper對象創建一個消息隊列。
二、looper.prepare多次調用
如果我們在同一個線程中多次調用Looper.prepare()方法,將會發生什麼事情呢?答案是會拋出異常:Only one Looper may be created per thread。
Looper.prepare()方法只能在當前線程中調用一次,多次調用會拋出RuntimeException異常。
try { Looper.prepare(); } catch (RuntimeException e) { Log.e(TAG, "prepare failed on this thread: " + Thread.currentThread()); return; }
三、looper.prepare looper.loop
調用Looper.prepare()方法和Looper.loop()方法可以開啟一個消息循環機制,該機制可以讓我們在主線程中進行異步操作。調用Looper.loop()方法會導致主線程進入無限循環狀態,如果在主線程中調用該方法,那麼該進程將無法響應其它的事件。
在調用Looper.loop()方法之前,需要先調用Looper.prepare()方法進行初始化操作。如果在Looper.loop()方法之前沒有調用Looper.prepare()方法,將會拋出異常:java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare()。
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { //處理消息邏輯 } }; Looper.prepare(); mHandler.sendEmptyMessage(0); Looper.loop();
四、looper.prepare 可以更新UI
在Android中,UI線程是通過一個消息循環機制來進行異步消息的處理。調用Looper.prepare()方法可以為當前線程創建一個消息隊列,如果我們需要在UI線程中進行異步操作,就需要使用到消息循環機制,這就需要在UI線程中調用Looper.prepare()方法。
Looper.prepare()方法可以在UI線程中進行調用,因此我們可以在UI線程中使用該方法進行一些異步操作,例如更新UI和響應用戶界面等等。但是需要注意的是,我們需要儘可能的保證UI線程不受阻塞,以便正常的UI更新操作能夠被執行。
runOnUiThread(new Runnable() { @Override public void run() { Looper.prepare(); Toast.makeText(MainActivity.this, "UI Thread with Looper", Toast.LENGTH_SHORT).show(); Looper.loop(); } });
五、looper.prepare的選取
在實際應用中,我們需要根據自己的需求來決定是否使用Looper.prepare()方法。如果需要在UI線程中進行異步操作,我們就需要在UI線程中使用Looper.prepare()方法來創建一個消息隊列。而在非UI線程中,我們可能需要手動使用Looper.prepare()方法來創建一個消息隊列,以便在非UI線程中進行異步操作。
在使用Looper.prepare()方法的過程中,需要注意一些潛在的風險。例如,如果在UI線程中過度使用Looper.prepare()方法,就會導致UI線程被阻塞,影響用戶的使用體驗。此外,如果在非UI線程中使用Looper.prepare()方法,需要注意控制異步操作的頻率,以便不會對系統造成過多的負擔。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/197373.html