-
handler-4查看全部
-
handler-3查看全部
-
handler_2查看全部
-
handler_1查看全部
-
handler_1查看全部
-
handler是用來發送和處理消息的,更新UI的查看全部
-
handler 消息處理機制 更新UI界面查看全部
-
1.不能直接在非UI線程直接更新UI(大多數時候)。<br> 2.每次創建Handler時需要給它綁定一個looper,如果是主線程不給定具體的looper則會綁定默認的looper。<br> 3.子線程運行時一定要調用start()方法。<br> 4.在某些特殊情況下在非UI線程是可以更新UI的//不推薦使用(當剛啟動Activity即onCreate里面此時onResume方法還沒有執行的時候可以,因為在線程中更新UI時會調用ViewParent.invalidateChild()方法檢查當前的Thread是否是UIThread,若為UIThread則可以更新(ViewParent是一個接口類,其實現是ViewRootImpl;invalidateChild()方法調用checkThread()方法來檢查線程是否為主線程)。ViewRootImp是在onResume方法中初始化的,所以只要在ViewRootImpl創建之前更新UI(在onCreate方法中創建線程并執行,此時還沒有初始化ViewRootImp),就可以逃避掉checkThread()的檢查進而更新UI。)查看全部
-
所有更新UI的操作,都要使用view的invalidate方法 settext方法中也使用了invalidate方法 invalidate(true) 判斷UI線程 invalidateChild(this,null)中調用invalidateChildInParent方法 中使用checkThread,檢查當前更新UI的操作是否在主線程之中 在Onresume方法中創建viewrootmp oncreate方法在onresume方法之前,所以在oncreate方法中沒有檢測子線程是否與UI線程相等查看全部
-
Android中更新UI的幾種方式: 1. activity.runOnUiThread() 2. handler.post() 3. handler.sendMessage() 4. view.post()查看全部
-
1.創建主線程的handler,并向子線程發送消息: //主線程的handler Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { Message message = new Message(); threadHandler.sendMessageDelayed(message, 1000);//向子線程發送消息 }; }; 2.創建子線程的handler,向主線程發送消息,要關聯一個threadHandler,threadHandler.getLooper()得到一個looper對象 HandlerThread handlerThread = new HandlerThread("handler thread"); handlerThread.start();//不要忘記調用start方法! //子線程的handler threadHandler = new Handler(handlerThread.getLooper()){ @Override public void handleMessage(Message msg) {//處理消息 Message message = new Message(); handler.sendMessageDelayed(message, 1000); } };查看全部
-
handlerThread 注意的地方 創建handler對象 指定Looper 在MyThread 的Looper對象 空指針異常 多線程并發 兩個線程可能Looper沒有創建 HandlerThread可以避免空指針問題 handlerThread對象 handler對象 thread.getLooper 原理判斷線程是否或者 空則等待 run方法創建 Looper通知加線程同步的判斷 默認所有的handlerThread中下載網絡資源 把所有的任務的發送處理 調用handlerThread查看全部
-
自定義Thread MyThread extend Thead 調用 Looper.prepare 與子線程相關的handler handler和子線程關聯 thread.sendMessage 如果在主線程中創建一個handler,并重寫handlemessage方法,那么一定不要在這里執行耗時操作,這樣有可能會將主線程卡死 創建一個與線程相關的Handler: 1. 在線程中通過Looper.prepare()方法創建一個與線程相關的Looper對象; 2. 在線程中通過Handler的new關鍵字,創建一個Handler對象,這個對象在創建的時候會關聯上1中創建的Looper對象 3. 調用Looper對象的loop()方法去輪詢它的MessageQueue 4. 通過其他的線程拿到這個線程的Handler對象之后調用sendMessage()之后,在這個線程中就可以進行Message的處理了。<br> <br> 我們一般是在主線程中創建Handler對象,在主線程中處理Message,在子線程中調用這個Handler對象的sendMessage()來發送message。所以Handler是在哪個線程創建就有哪個線程處理Message和輪詢,而由別的線程負責給這個Handler發送Message。 * 每個線程都對應一個looper,在線程里面創建的handler默認都會與這個looper對應 * 一個線程可以有多個handler與唯一的一個looper對應,有且只有一個looper * 這里主要是讓我們熟悉在oncreat創建的handler與子線程創建handler * oncreate創建的handler他默認里面會有一個looper與之對應 * 所以我們自己在子線程中創建handler對象的時候我們應該要自主創建一個looper查看全部
-
使用“Message”方式“發送消息”,使“Handler處理消息,并更新UI” 1.定義Handler,并且實例化,使用默認構造函數即可。 2.重寫handlerMessage方法。 private Handler msgHandler=new Handler(){ //定義handler,重寫處理message方法。當該handler發送消息的時候,這個方法會被執行。 public void handleMessage(android.os.Message msg) { //msg為當有sendMessage方法調用時,傳過來的Message對象。 mTextView.setText("msg:"+msg.arg1); }; }; 3.定義Message對象。其中,Message提供了三個公共變量。arg1,arg2,obj,可以將消息放入其中,作為消息信息。然后發送消息即可 new Thread() { public void run() { Message message=msgHandler.obtainMessage();//從Handler對象中獲取Message對象,而不是自己new,這樣效率高。 message.arg1=1; message.sendToTarget(); //對于從handler對象中獲取的message,可以直接使用該方法發送消息。 //msgHandler.sendMessage(message); //發送消息 }; }.start(); 知識拓展: 1。實例化Handler時,可以使用帶一個Callback接口參數的構造函數。 其中Callback有一個未實現的方法。 這個方法有一個返回值(boolean) 2.當該Handler收到消息時,首先會調用Callback中的消息處理方法。 2.1 如果返回值為false,消息不會被截斷。Handler依然可以處理該消息。 2.2 如果返回值為true,消息將會被截斷。Handler中的處理消息方法不會被執行。查看全部
-
使用“Handler”更新UI 1.使用post或postDelayed()方法。 2.在子線程中可以調用post方法。來將更新UI消息加入到隊列中。這樣就可以更新UI了 其中。需要一個參數。Runnable,在run方法下寫更新UI的操作即可。 new Thread(new Runnable() { @Override public void run() { /** * 將Runnable中要執行的內容加入消息隊列。 * 可以在這之中更新ui * */ mHandler.post(new Runnable() { @Override public void run() { mTextView.setText("我是被更新后的值"); } }); } }).start(); 3.使用mHandler.postDelayed(myRunnable, 1000);更新UI同樣道理,但是會在延遲時間之后執行。可以使用其來進行輪換操作查看全部
舉報
0/150
提交
取消