zoukankan      html  css  js  c++  java
  • 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);
     }
    }
    }
  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/2434985.html
Copyright © 2011-2022 走看看