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

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

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次的消息到各个线程,各个线程也分别各自发来各自的应答信息.


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值