-
在子線程中更新UI 1.當剛啟動Activity即onCreate里面此時onResume方法還沒有執行的時候可以,因為在線程中更新UI時會調用ViewParent.invalidateChild()方法檢查當前的Thread是否是UIThread,若為UIThread則可以更新(ViewParent是一個接口類,其實現是ViewRootImpl;invalidateChild()方法調用checkThread()方法來檢查線程是否為主線程)。ViewRootImp是在onResume方法中初始化的,所以只要在ViewRootImpl創建之前更新UI(在onCreate方法中創建線程并執行,此時還沒有初始化ViewRootImp),就可以逃避掉checkThread()的檢查進而更新UI。 2.-->剛啟動的時候,立即在非UI線程更新->不報錯(onResume還沒有執行) --->休眠2s鐘以后,更新——————>報錯查看全部
-
更新UI的4種方式(其實內部都是handler機制): 1.通過Handler的post方法(); 2.調用Handler.sendMessage()或Handler.sendEmptyMessage()方法,傳統的方法 3.重寫Activity中的runOnUIThread方法更新; 4.調用View自身的post(Runnable run)方法更新;查看全部
-
子線程與主線程之間的相互通信 1.子線程通過 HandlerThread的thread.getLooper()綁定, 2.在主線程的handler的handlerMessage中調用threadHandler.sendMessageDelay(msg,1000);向子線程發送消息。 3.在子線程中通過handler.sendMessageDelay(msg,1000);向主線程發送消息 4.在一個啟動點btn調用主線程的handler.sendEmptyMessage(int x);查看全部
-
1. Handler在創建的時候可以指定Looper,這樣通過Handler的sendMessage()方法發送出去的消息就會添加到指定Looper里面的MessageQueue里面去。在不指定Looper的情況下Handler綁定的是創建它的線程的Looper。如果這個線程的Looper不存在,程序將拋出"Can't create handler inside thread that has not called Looper.prepare()"。 2. HandlerThread繼承于Thread,所以它本質就是個Thread。與普通Thread的差別就在于,它自帶一個封裝好了的Looper成員變量。在其run()方法中,調用Looper.myLooper()獲得一個looper對象。 3. HandlerThread的用處 創建Handler時指定的looper,也可以是別的線程創建的。所以Handler中MessageQueue的輪詢不一定非要在創建Handler的線程進行,還可以在別的線程中進行。 這個時候我們就需要使用HandlerThread這個類的Looper,這樣消息的處理就在新創建的HandlerThread中進行。模擬異步處理,主線程給子線程發送消息,在子線程中處理比較耗時的操作。 mThread = new HandlerThread("Handler Thread");//為新創建的線程指定一個名字,HandlerThread線程獨有 mHandler = new Handler(mThread.getLooper()){ public void handleMessage(android.os.Message msg) {... }; };查看全部
-
* 每個線程都對應一個looper,在線程里面創建的handler默認都會與這個looper對應 * 一個線程可以有多個handler與唯一的一個looper對應,有且只有一個looper * 這里主要是讓我們熟悉在oncreat創建的handler與子線程創建handler * oncreate創建的handler他默認里面會有一個looper與之對應 * 所以我們自己在子線程中創建handler對象的時候我們應該要自主創建一個looper查看全部
-
handler原理查看全部
-
google為什么只設計了handler來解決更新ui的問題? 最根本的目的就是解決多線程并發問題,假設如果在一個Activity當中,有多個線程去更新ui,并且都沒有加鎖機制,那么就會出現更新界面錯亂,但是如果都進行加鎖處理的話,又會導致性能下降 因此,產生了這種handler的更新機制,根本不用去關心多線程的問題,所有的更新ui的操作,都是在主線程的消息隊列當中去輪詢處理的 圖為handler原理查看全部
-
1.使用Handler的sendMessage()和handleMessage() handleMessage() private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { mTextView.setText("" + msg.arg1); }; }; 主線程中新建一個Thread發送message給主線程。 new Thread() { public void run() { Message message = handler.obtainMessage(); message.arg1 = 88; handler.sendMessage(message); }; }.start(); 2. 移除runnable對象 對應于handler.postDelayed(myRunnable, 2000);直接handler.removeCallbacks(myRunnable); 3. 截獲message 在創建handler對象時,調用new Handler(Callback callback)方法。 private Handler handler = new Handler(new Callback() { public boolean handleMessage(Message msg) { return true; //return true就截獲,return false不截獲 } }){ public void handleMessage(Message msg) { } }; 在主線程中執行handler.sendEmptyMessage(1)。其原理: 當Handler收到message時,新創建的Callback將首先執行,其handleMessage()將會處理消息;如果Callback的handleMessage()不截獲消息,然后Handler才可能會收到消息。查看全部
-
如果我們直接在一個Activity中new一個Thread,并在其中的run方法中去更新ui,那么此時這個程序是會直接崩潰掉的,也就是說,我們不能直接在非ui線程中去更新ui,需要使用到Handler的機制才能實現我們的效果 Handler的方法 sendMessage sendMessageDelayed post(Runnable) postDelayed(Runnable,long)查看全部
-
handler是android給我們提供用來更新UI的一套機制,也是一套消息處理機制,我們可以通過它發送消息,也可以通過它處理消息 為什么要用hander,不用是否可行? 是不行的。android在設計的時候就封裝了一套消息創建、傳遞、處理機制,如果不遵循這樣的機制就沒有辦法更新UI信息的,就會拋出異常信息。查看全部
-
Handler主要作用有兩個,一個是更新UI,另外一個是可以進行消息處理查看全部
-
這章,好抽象。要好好理解下!查看全部
-
看截圖查看全部
-
一句話說明handler與looper和messagequeue之間的關系查看全部
-
在子線程中創建Handler時必須與手動創建的Looper相關聯,即new Handler(looper);查看全部
舉報
0/150
提交
取消