Android之Handler(主线程,自己线程,其他线程互发消息)



public class mainSendToMain extends Activity { 
    private Button btnTest; 
    private TextView textView; 
    private Handler handler; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        btnTest = (Button)this.findViewById(R.id.btn_01); 
        textView = (TextView)this.findViewById(R.id.view_01); 
        btnTest.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View arg0) { 
                Looper looper = Looper.getMainLooper();       // getMainLooper()方法是返回 主线程的Looper对象 
                 //这里以主线程的Looper对象创建了handler, 
                //所以,这个handler发送的Message会被传递给主线程的MessageQueue。 
                handler = new MyHandler(looper); 
                //构建Message对象 
                //第一个参数:是自己指定的message代号,方便在handler选择性地接收 
                //第二三个参数是传递的整型值,对内存消耗较少 
                //第四个参数需要封装的对象 
                Message msg = handler.obtainMessage(1,2,3,"主线程发消息了"); 
                handler.sendMessage(msg); //发送消息 
            } 
        }); 
    } 
    class MyHandler extends Handler{ 
        public MyHandler(Looper looper){ 
            super(looper); 
        } 
        public void handleMessage(Message msg){ 
            textView.setText("我是主线程的Handler,收到了消息:"+msg.obj); 
        } 
    } 


其他线程给自己发送消息:

 

 public class otherSendToIts extends Activity{

  private Button btnTest; 
    private TextView textView; 
    private Handler handler; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        btnTest = (Button)this.findViewById(R.id.btn_01); 
        textView = (TextView)this.findViewById(R.id.view_01); 
        
        btnTest.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View arg0) { 
                 //启动线程 
                new MyThread().start();     
            } 
        }); 
    } 
    class MyHandler extends Handler{ 
        public MyHandler(Looper looper){ 
            super(looper); 
        } 
        public void handleMessage(Message msg){ 
            super.handleMessage(msg); 
            textView.setText((String)msg.obj); 
        } 
    }     
    class MyThread extends Thread{ 
        public void run(){ 
            Looper.prepare();        //创建该线程的Looper对象 
            handler = new ThreadHandler(Looper.myLooper());  //这里Looper.myLooper()获得的就是该线程的Looper对象了
            Message msg = handler.obtainMessage(1,1,1,"我自己"); 
            handler.sendMessage(msg); 
            Looper.loop();  
        } 
         //定义线程类中的消息处理类 
        class ThreadHandler extends Handler{ 
            public ThreadHandler(Looper looper){ 
                super(looper); 
            } 
            public void handleMessage(Message msg){ 
                 //这里对该线程中的MessageQueue中的Message进行处理 
                //这里我们再返回给主线程一个消息 
                //加入判断看看是不是该线程自己发的信息 
                if(msg.what == 1 && msg.obj.equals("我自己")){ 
                    handler = new MyHandler(Looper.getMainLooper()); 
                    Message msg2 = handler.obtainMessage(1,1,1,"禀告主线程:我收到了自己发给自己的Message"); 
                    handler.sendMessage(msg2);                 
                } 
            } 
        } 
    } 

 

 其他线程给主线程发送消息:

 public class otherSendToMain extends Activity{

private Button btn;
private TextView textView;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.btn_01);
textView = (TextView) findViewById(R.id.view_01);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new MyThread().start();
}
});
}
class MyHandler extends Handler{
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
textView.setText("我是主线程的Handler,收到了消息:"+(String)msg.obj);
}
}
class MyThread extends Thread{
public void run(){
Looper looper = Looper.getMainLooper();
handler = new MyHandler(looper);
Message message = handler.obtainMessage(1,2,3,"其他线程发消息了");
handler.sendMessage(message);
}
}
}

 

 主线程给其他线程发送消息:

public class mainSendToOther extends Activity {
 Button button3;
 TextView textView;
 Looper mainLooper;
 
  // 其它线程
 OtherHandler otherHandler;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 
  button3 = (Button) findViewById(R.id.btn_01);
  textView = (TextView) findViewById(R.id.view_01);
  button3.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Message msg =otherHandler.obtainMessage(1,"这是主线程发送的消息");
   otherHandler.sendMessage(msg);
}});
  
  MyThread thread = new MyThread();
  thread.start();
 
 }
 class MyThread extends Thread
 {
  @Override
  public void run() {
   // TODO Auto-generated method stub
   super.run();
    //创建该线程的Looper对象,用于接收消息
   Looper.prepare();
    //线程的looper创建的handler表示消息接收者是子线程
   otherHandler = new OtherHandler(Looper.myLooper());
    //循环从MessageQueue中取消息。 
   Looper.loop();
  }
 }
 
 
 class OtherHandler extends Handler
 {
  public OtherHandler() {
   // TODO Auto-generated constructor stub
  }
  public OtherHandler(Looper looper) {
   // TODO Auto-generated constructor stub
   super(looper);
  
  }
  
  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   mainHandler = new MainHandler(Looper.getMainLooper());
   Message message = new Message();
   message.obj="子线程收到消息";
   mainHandler.sendMessage(message); 
  }
 }
 
 MainHandler mainHandler;
 class MainHandler extends Handler
 {
  public MainHandler() {
   // TODO Auto-generated constructor stub
  }
  
  public MainHandler(Looper looper) {
   // TODO Auto-generated constructor stub
   super(looper);
  }
  
  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   textView.setText("我是主线程,这是收到的消息:"+msg.obj);
  }
 }
}
public class mainSendToMain extends Activity { 
    private Button btnTest; 
    private TextView textView; 
    private Handler handler; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        btnTest = (Button)this.findViewById(R.id.btn_01); 
        textView = (TextView)this.findViewById(R.id.view_01); 
        btnTest.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View arg0) { 
                Looper looper = Looper.getMainLooper();       // getMainLooper()方法是返回 主线程的Looper对象 
                 //这里以主线程的Looper对象创建了handler, 
                //所以,这个handler发送的Message会被传递给主线程的MessageQueue。 
                handler = new MyHandler(looper); 
                //构建Message对象 
                //第一个参数:是自己指定的message代号,方便在handler选择性地接收 
                //第二三个参数是传递的整型值,对内存消耗较少 
                //第四个参数需要封装的对象 
                Message msg = handler.obtainMessage(1,2,3,"主线程发消息了"); 
                handler.sendMessage(msg); //发送消息 
            } 
        }); 
    } 
    class MyHandler extends Handler{ 
        public MyHandler(Looper looper){ 
            super(looper); 
        } 
        public void handleMessage(Message msg){ 
            textView.setText("我是主线程的Handler,收到了消息:"+msg.obj); 
        } 
    } 


其他线程给自己发送消息:

 

 public class otherSendToIts extends Activity{

  private Button btnTest; 
    private TextView textView; 
    private Handler handler; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        btnTest = (Button)this.findViewById(R.id.btn_01); 
        textView = (TextView)this.findViewById(R.id.view_01); 
        
        btnTest.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View arg0) { 
                 //启动线程 
                new MyThread().start();     
            } 
        }); 
    } 
    class MyHandler extends Handler{ 
        public MyHandler(Looper looper){ 
            super(looper); 
        } 
        public void handleMessage(Message msg){ 
            super.handleMessage(msg); 
            textView.setText((String)msg.obj); 
        } 
    }     
    class MyThread extends Thread{ 
        public void run(){ 
            Looper.prepare();        //创建该线程的Looper对象 
            handler = new ThreadHandler(Looper.myLooper());  //这里Looper.myLooper()获得的就是该线程的Looper对象了
            Message msg = handler.obtainMessage(1,1,1,"我自己"); 
            handler.sendMessage(msg); 
            Looper.loop();  
        } 
         //定义线程类中的消息处理类 
        class ThreadHandler extends Handler{ 
            public ThreadHandler(Looper looper){ 
                super(looper); 
            } 
            public void handleMessage(Message msg){ 
                 //这里对该线程中的MessageQueue中的Message进行处理 
                //这里我们再返回给主线程一个消息 
                //加入判断看看是不是该线程自己发的信息 
                if(msg.what == 1 && msg.obj.equals("我自己")){ 
                    handler = new MyHandler(Looper.getMainLooper()); 
                    Message msg2 = handler.obtainMessage(1,1,1,"禀告主线程:我收到了自己发给自己的Message"); 
                    handler.sendMessage(msg2);                 
                } 
            } 
        } 
    } 

 

 其他线程给主线程发送消息:

 public class otherSendToMain extends Activity{

private Button btn;
private TextView textView;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.btn_01);
textView = (TextView) findViewById(R.id.view_01);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new MyThread().start();
}
});
}
class MyHandler extends Handler{
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
textView.setText("我是主线程的Handler,收到了消息:"+(String)msg.obj);
}
}
class MyThread extends Thread{
public void run(){
Looper looper = Looper.getMainLooper();
handler = new MyHandler(looper);
Message message = handler.obtainMessage(1,2,3,"其他线程发消息了");
handler.sendMessage(message);
}
}
}

 

 主线程给其他线程发送消息:

public class mainSendToOther extends Activity {
 Button button3;
 TextView textView;
 Looper mainLooper;
 
  // 其它线程
 OtherHandler otherHandler;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 
  button3 = (Button) findViewById(R.id.btn_01);
  textView = (TextView) findViewById(R.id.view_01);
  button3.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Message msg =otherHandler.obtainMessage(1,"这是主线程发送的消息");
   otherHandler.sendMessage(msg);
}});
  
  MyThread thread = new MyThread();
  thread.start();
 
 }
 class MyThread extends Thread
 {
  @Override
  public void run() {
   // TODO Auto-generated method stub
   super.run();
    //创建该线程的Looper对象,用于接收消息
   Looper.prepare();
    //线程的looper创建的handler表示消息接收者是子线程
   otherHandler = new OtherHandler(Looper.myLooper());
    //循环从MessageQueue中取消息。 
   Looper.loop();
  }
 }
 
 
 class OtherHandler extends Handler
 {
  public OtherHandler() {
   // TODO Auto-generated constructor stub
  }
  public OtherHandler(Looper looper) {
   // TODO Auto-generated constructor stub
   super(looper);
  
  }
  
  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   mainHandler = new MainHandler(Looper.getMainLooper());
   Message message = new Message();
   message.obj="子线程收到消息";
   mainHandler.sendMessage(message); 
  }
 }
 
 MainHandler mainHandler;
 class MainHandler extends Handler
 {
  public MainHandler() {
   // TODO Auto-generated constructor stub
  }
  
  public MainHandler(Looper looper) {
   // TODO Auto-generated constructor stub
   super(looper);
  }
  
  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   textView.setText("我是主线程,这是收到的消息:"+msg.obj);
  }
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值