主線程給主線程發送訊息:
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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubnew MyThread().start();}});}class MyHandler extends Handler{public MyHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.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(){@Overridepublic 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); } }}