-
handler原理查看全部
-
handler機制原因查看全部
-
Handler與Looper和MessageQueue的關系查看全部
-
handler中常見的兩種報錯查看全部
-
handler查看全部
-
帶Callback參數的Handler可以截獲消息,true則攔截,false則不攔截查看全部
-
面試用:在非主線程是否可以更新UI 答:當剛啟動還沒有onResume的時候可以,即onCreate里面 ViewRootImp是在onResume方法中初始化的,在onCreate方法中創建線程并執行,此時還沒有初始化ViewRootImp查看全部
-
更新ui的四種方法: 第一種: private void handle1(){ handler.post(new Runnbale(){ public void run(){ textView.setText("ok"); } }); } 第二種:直接在子線程中使用sendMessage,在創建handler對象的時候,在其中的handleMessage方法中去更新ui private void handler2(){ handler.sendEmptyMessage(1); } 第三種: private void handler3(){ runOnUiThread(new Runnable(){ public void run(){ textView.setText("ok"); } }) } 第四種: private void viewUi(){ textView.post(new Runnable(){ public void run(){ textView.setText("ok"); } }) }查看全部
-
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 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對象。 synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); 在創建handler時使用getLooper()方法,其實現其實是一直等待looper對象的獲得。 while (isAlive() && mLooper == null) { try { wait(); } } 3. HandlerThread的用處 創建Handler的時指定的looper,可以是別的線程創建的。所以Handler中MessageQueue的輪詢不一定非要是創建Handler的線程進行,還可以在別的線程中進行。 這個時候我們就需要使用HandlerThread這個類來創建這個Looper了,這樣消息的處理就在新創建的HandlerThread中進行。 mThread = new HandlerThread("Handler Thread"); mHandler = new Handler(mThread.getLooper()){ public void handleMessage(android.os.Message msg) {... }; }; 同樣需要注意:在新創建的ThreadThread中不能有更新UI的操作。查看全部
-
public class MyThread extends Thread { /** * 與子線程相關的Handler */ public Handler handler; @Override public void run() { Looper.prepare();//消息隊列準備 handler = new Handler(){ @Override public void handleMessage(Message msg) { System.out.println("currentThread:" + Thread.currentThread()); } }; Looper.loop();//循環處理消息 } }查看全部
-
Message:消息,其中包含了消息ID,消息處理對象以及處理的數據,由MessageQueue同意列隊,終由Handle處理 Handle:處理者,負責Message的接受和處理,使用Handle時,需要實現handleMessage(Message msg)方法對特定的Message進行處理,例如對UI更新等。 MessageQueue:消息隊列,用來存放Handle發送過來的消息,并按照FIFO規則執行,當然,存放Message并非實際意義的保存,而是將Message以鏈表的方法串聯起來的,等待Looper的抽取 Looper:消息泵。不斷地從MessageQueue中抽取Message執行,因此,一個MessageQueue需要一個Looper。 Thread:線程,負責調整整個消息循環,及消息循環的執行場所查看全部
-
1、handler 消息處理器,負責處理消息。 2、Message 消息,包含消息id,被處理的對象。 3、MessageQueue 消息隊列,存放Handler發送過來的Message 4、looper 消息泵,不間斷的從MessageQueue消息隊列中抽取消息。 簡單的比喻looper就是水泵,MessageQueue儲水的池塘,Message就是水,Handler就是操作的人查看全部
-
handler.removeCallBack(runnable) 可以移除一個已經掛接執行的方法 Handler handler=new Handler(new Callback(){里面也有個boolean handleMessage 返回true時可以截獲發送到handler的message}){@Override void handleMessage()}查看全部
-
通過 handler來實現sendMessage的方法的步驟: 1.創建一個handler的對象,并在其中重寫handlerMessage的方法,并在其中更新ui private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { textView.setText("" + msg.arg1);};}; 2.創建一個Thread類,在其中的run()方法中初始化一個message,并為message來賦值,并調用handler的sendMessage的方法 new Thread() { public void run() { try { Thread.sleep(2000); Message message = new Message(); message.arg1 = 88; handler.sendMessage(message); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; 這樣,執行這個線程的時候就會通過sendMessage的方法將message參數傳遞過去,并在上面的初始化handler的時候接受到參數,并實現更新ui Message message=handler.obtainMessage()得到系統消息(自動定位到handler就不用handler.sendMessage())或者Message message=new Message() handler發送的消息 handler.sendMessage(message) message.sendToTarget()對于已經綁定好handler的message查看全部
舉報
0/150
提交
取消