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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM