11

当我使用Handler.dispatchMessage(msg)时,handleMessage(Message msg)将在新线程上运行,但当我使用时Handler.sendMessage(msg)handleMessage(Message 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:信息/主要活动(774):主要:1
04-19 11:32:10.488:信息/MainActivity(774):线程:8
04-19 11:32:10.492: INFO/MainActivity(774): 处理程序:8 & arg1=1
04-19 11:32:10.635:INFO/MainActivity(774):处理程序:1 & arg1=2

4

3 回答 3

8

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);
    }
}
于 2012-04-19T13:18:00.390 回答
3

如果您在主线程中调用,Handler.dispatchMessage()则消息在主线程中处理。

如果Handler.dispatchMessage()在工作线程中调用 ,则消息在工作线程中处理。

当您调用Handler.sendMessage(msg)消息时在创建处理程序的线程中处理。

于 2020-02-14T10:30:50.230 回答
1

发送的消息Handler.sendMessage()将在您创建的线程上处理testMethod()

发送的消息Handler.dispatchMessage()main线程上处理。

于 2019-06-26T15:12:12.880 回答