主线程和另一个线程互发消息进行处理的例子.这个例子是从别人那里拿来的,依照个人喜好重新命名而已.因此还是转发.
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;
@Override
public 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()
{
@Override
public 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);
}
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
textView.setText("我是主线程,这是收到的消息:" + msg.obj);
}
}
// //
// 以下是其他线程类和他的handler类
class MyThread extends Thread
{
@Override
public 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);
}
@Override
public 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>();
@Override
public 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()
{
@Override
public 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);
}
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
textView.setText("我是主线程,这是收到的消息:" + msg.obj + msg.getWhen());
}
}
// //
// 以下是其他线程类和他的handler类
class MyThread extends Thread
{
@Override
public 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);
}
@Override
public 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次的消息到各个线程,各个线程也分别各自发来各自的应答信息.