2012-04-19 34 views
6

,handleMessage(消息msg)將在新線程上運行,但是當我使用Handler.sendMessage( msg),handleMessage(Message msg)將在主線程上運行,誰可以告訴我它們之間的區別。當我使用Handler.dispatchMessage(msg)時,Handler.dispatchMessage(msg)和Handler.sendMessage(msg)之間的區別

謝謝!

演示:

public class MainActivity extends Activity 
{ 
private String TAG = "MainActivity"; 
private Handler mHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     Log.i(TAG, "Handler:" + Thread.currentThread().getId() + "&arg1=" + msg.arg1); 
     super.handleMessage(msg); 
    } 

}; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Log.i(TAG, "Main:" + Thread.currentThread().getId()); 
    testMethod(); 
} 

private void testMethod() 
{ 
    Thread thread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      Log.i(TAG, "Thread:" + Thread.currentThread().getId()); 
      Message msg = mHandler.obtainMessage(); 
      msg.arg1 = 1; 
      mHandler.dispatchMessage(msg); 
      Message msg2 = mHandler.obtainMessage(); 
      msg2.arg1 = 2; 
      mHandler.sendMessage(msg2); 
     } 

    }; 
    thread.start(); 
} 

}

輸出:

 
04-19 11:32:10.452: INFO/MainActivity(774): Main:1 
04-19 11:32:10.488: INFO/MainActivity(774): Thread:8 
04-19 11:32:10.492: INFO/MainActivity(774): Handler:8&arg1=1 
04-19 11:32:10.635: INFO/MainActivity(774): Handler:1&arg1=2 

回答

5

mHandler.dispatchMessage(msg)就像是直接調用handleMessage(Message msg),我不知道什麼時候會很有用。處理程序的重點是將消息發送到其他線程的能力。這就是你用sendMessage所做的。

編輯:你可以看到它只是給你打電話handleMessage()

/** 
* Handle system messages here. 
*/ 
public void dispatchMessage(Message msg) { 
    if (msg.callback != null) { 
     // callback = the Runnable you can post "instead of" Messages. 
     msg.callback.run(); 
    } else { 
     if (mCallback != null) { 
      if (mCallback.handleMessage(msg)) { 
       return; 
      } 
     } 
     handleMessage(msg); 
    } 
} 
+0

哪裏對象**「消息」**來自上面的代碼? – waqaslam 2012-04-19 13:46:01

+0

@Waqas from your code'mHandler.dispatchMessage(msg)' - 它是'Handler.dispatchMessage'的源代碼(稍微簡化) – zapl 2012-04-19 13:52:11

+0

是的,但是* dispatchMessage(消息味精)*說** msg **,但是在代碼中它也是使用**消息**這是誰我關於 – waqaslam 2012-04-19 13:58:04