2012-04-19 21 views
6

cuando utilizo Handler.dispatchMessage (msg), el handleMessage (Message msg) se ejecutará en un nuevo hilo, pero cuando utilizo Handler.sendMessage (msg), handleMessage (Message msg) se ejecutará en el hilo principal, quien puede decirme la diferencia entre ellos.La diferencia entre Handler.dispatchMessage (msg) y Handler.sendMessage (msg)

gracias!

Demostración:

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(); 
} 

}

Salida:

 
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 

Respuesta

5

mHandler.dispatchMessage(msg) es como llamar directamente handleMessage(Message msg) y no sé cuándo podría ser útil. El objetivo de Handlers es la capacidad de enviar mensajes a otros hilos. Eso es lo que haces con sendMessage.

Editar: como puede ver, simplemente llama a handleMessage() para usted.

/** 
* 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

¿de dónde viene el objeto ** "mensaje" ** en el código anterior? – waqaslam

+0

@Waqas desde su código 'mHandler.dispatchMessage (msg)' - es el código fuente de 'Handler.dispatchMessage' (ligeramente simplificado) – zapl

+0

sí, pero * dispatchMessage (Mensaje de mensaje) * dice ** msg **, pero en código también usando ** mensaje ** que es a quien me concierne acerca de – waqaslam

Cuestiones relacionadas