2012-04-19 14 views
6

quando utilizzo Handler.dispatchMessage (msg), il handleMessage (Message msg) verrà eseguito sul nuovo thread, ma quando utilizzo Handler.sendMessage (msg), handleMessage (Message msg) verrà eseguito sul thread principale, che può dirmi la differenza tra loro.La differenza tra Handler.dispatchMessage (msg) e Handler.sendMessage (msg)

grazie!

Demo:

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

}

uscita:

 
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 

risposta

5

mHandler.dispatchMessage(msg) è come chiamare direttamente handleMessage(Message msg) e non so quando sarebbe utile. Il punto di Handler è la capacità di inviare messaggi ad altri thread. Questo è quello che fai con sendMessage.

Modifica: come potete vedere basta chiamare il numero handleMessage() per voi.

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

da dove viene l'oggetto ** "messaggio" ** proviene dal codice precedente? – waqaslam

+0

@Waqas dal codice 'mHandler.dispatchMessage (msg)' - è il codice sorgente per 'Handler.dispatchMessage' (leggermente semplificato) – zapl

+0

sì ma * dispatchMessage (messaggio msg) * dice ** msg **, ma nel codice è anche utilizzando ** messaggio **, di chi sono interessato a circa – waqaslam

Problemi correlati