主线程和另一个线程互发消息进行处理的例子

来源:互联网 发布:广东房卡麻将源码 编辑:程序博客网 时间:2024/06/05 21:04

主线程和另一个线程互发消息进行处理的例子.这个例子是从别人那里拿来的,依照个人喜好重新命名而已.因此还是转发.

import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MyHandlerActivity extends Activity{/** Called when the activity is first created. */// 主线程给子线程发送消息Button button3;TextView textView;// 主线程MainActivityHandler mainHandler;// 其它线程MyThreadHandler myThreadHandler;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);button3 = (Button) findViewById(R.id.button3);textView = (TextView) findViewById(R.id.text);button3.setOnClickListener(clickListener);MyThread thread = new MyThread();thread.start();}OnClickListener clickListener = new OnClickListener(){@Overridepublic void onClick(View v){switch (v.getId()){// 主线程给子线程发送消息case R.id.button3:// 在主线程中获取子线程的message对象然后再发送Message msg = myThreadHandler.obtainMessage(1, "这是主线程发送的消息");// msg.obj="这是主线程发送的消息";myThreadHandler.sendMessage(msg);break;default:break;}}};class MainActivityHandler extends Handler{public MainActivityHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);textView.setText("我是主线程,这是收到的消息:" + msg.obj);}}// //////////////////////////////////////////////////////////////////////////// 以下是其他线程类和他的handler类class MyThread extends Thread{@Overridepublic void run(){super.run();// 创建该线程的Looper对象,用于接收消息Looper.prepare();// 线程的looper创建的handler表示消息接收者是子线程myThreadHandler = new MyThreadHandler(Looper.myLooper());// 循环从MessageQueue中取消息。Looper.loop();}}class MyThreadHandler extends Handler{public MyThreadHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);// textView.setText("我是子线程,这是收到的消息:" + msg.obj);这里直接操作UI线程的内容是不行的会出错mainHandler = new MainActivityHandler(Looper.getMainLooper());Message message = new Message();message.obj = "子线程收到消息.收到的消息内容是:" + msg.obj;mainHandler.sendMessage(message);}}}

我这里有一个疑问如果我要生成两个这样的MyThread线程应该怎么做呢?这里的消息的分发好像就有问题了.

MyThread thread = new MyThread();thread.start();MyThread thread2 = new MyThread();thread2.start();

这个疑问留着探索.


源程序下载地址:http://download.csdn.net/detail/thanklife/6621969



经过探索,我发现可以实现一个主线程给多个线程发送消息,主线程接收每个线程的内容进行处理

下面是我改造的例子:

package com.boao;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MyHandlerActivity extends Activity{/** Called when the activity is first created. */// 主线程给子线程发送消息Button button3;TextView textView;// 主线程MainActivityHandler mainHandler;// 其它线程List<MyThreadHandler> list = new ArrayList<MyHandlerActivity.MyThreadHandler>();@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);button3 = (Button) findViewById(R.id.button3);textView = (TextView) findViewById(R.id.text);button3.setOnClickListener(clickListener);for (int i = 0; i < 10; i++){MyThread thread = new MyThread();thread.start();}}OnClickListener clickListener = new OnClickListener(){@Overridepublic void onClick(View v){switch (v.getId()){// 主线程给子线程发送消息case R.id.button3:// 在主线程中获取子线程的message对象然后再发送for (int i = 0; i < list.size(); i++){MyThreadHandler myThreadHandler = list.get(i);Message msg = myThreadHandler.obtainMessage(1, "这是主线程发送的消息"+ myThreadHandler.toString());// msg.obj="这是主线程发送的消息";myThreadHandler.sendMessage(msg);}break;default:break;}}};class MainActivityHandler extends Handler{public MainActivityHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);textView.setText("我是主线程,这是收到的消息:" + msg.obj + msg.getWhen());}}// //////////////////////////////////////////////////////////////////////////// 以下是其他线程类和他的handler类class MyThread extends Thread{@Overridepublic void run(){super.run();// 创建该线程的Looper对象,用于接收消息Looper.prepare();// 线程的looper创建的handler表示消息接收者是子线程MyThreadHandler myThreadHandler = new MyThreadHandler(Looper.myLooper());list.add(myThreadHandler);// 循环从MessageQueue中取消息。Looper.loop();}}class MyThreadHandler extends Handler{public MyThreadHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);// textView.setText("我是子线程,这是收到的消息:" + msg.obj);这里直接操作UI线程的内容是不行的会出错mainHandler = new MainActivityHandler(Looper.getMainLooper());Message message = new Message();message.obj = "子线程收到消息.收到的消息内容是:" + msg.obj;mainHandler.sendMessage(message);}}}

经过测试,发送了10次的消息到各个线程,各个线程也分别各自发来各自的应答信息.


原创粉丝点击