代码如下:
public class MainActivity extends Activity implements Runnable{

 Handler handler = new Handler(){
public void handleMessage(Message msg){
S.p(Thread.currentThread().getId()+"-------------Handler");
}
};
 
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        S.p(Thread.currentThread().getId()+"-------------MainActivity");
        
        new Thread(this).start();
    }
    
    @Override
public void run() {
    
     S.p(Thread.currentThread().getId()+"-------------New Thread");
     try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
     handler.handleMessage(handler.obtainMessage());
}
}

解决方案 »

  1. 主线程拥有自己的消息列队,一般线程创建时没有自己的消息列队,消息处理时就在主线程中完成,如果线程中使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成。public class MainActivity extends Activity implements Runnable{
        
         Handler handler = new Handler(){
                public void handleMessage(Message msg){
                    S.p(Thread.currentThread().getId()+"-------------Handler"); //这是主线程ID
                }
            };
         
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            S.p(Thread.currentThread().getId()+"-------------MainActivity");  //这是主线程ID
            
            new Thread(this).start();
        }
        
        @Override
        public void run() {
            
            S.p(Thread.currentThread().getId()+"-------------New Thread");  //这是新线程ID
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            handler.handleMessage(handler.obtainMessage());
        }
    }
      


  2. 谢谢你的回答。我在运行这个程序的时候,得到的结果是这样:08-28 02:51:13.838: INFO/System.out(437): 1-------------MainActivity
    08-28 02:51:14.248: INFO/System.out(437): 8-------------New Thread
    08-28 02:51:17.317: INFO/System.out(437): 8-------------Handler
    不知道handler为何会和子线程取得相同ID,还请指教。
      


  3. 不仔细看还没看到呢 :-)  你用错了handler.handleMessage(handler.obtainMessage());
    改成handler.sendMessage(handler.obtainMessage());
    不然相当于子函数调用了。
      

类似问题 »