Handler Looper Message(二)

这个Message 和Handler 究竟怎么传递消息:


我是这样理解的:



一个Handler 的对象只能给这个Handler传递消息。

一个线程中只有一个Looper 一个Looper管理一个MessageQueue 

但是一个 Thread 中有多个Handler 的时候 多个Handler 绑定的是一个 Looper 那怎么解释 同一个 Looper 绑定的MessageQueue 对(好了,迷了,,是Handler的限制)


直接贴代码:

/**
 * @作者 杨铭;
 * @时间 2015年6月18日_下午9:50:11;
 * @联系qq   <771365380>\<286384491>;
 */
package a14.yangming.test_handlermessagelooper;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;

public class Handler_Main_Thread extends Handler
{
	private Context context;

	public Handler_Main_Thread(Context callContext)
	{
		this.context = callContext;
	}

	@Override
	public void handleMessage(Message msg)
	{
		switch (msg.what)
		{
			case 2:
				System.out.println("收到本类对象的消息");
				Toast.makeText(this.context, "收到本类对象的消息", Toast.LENGTH_LONG).show();
				break;

			default:
				break;
		}
		super.handleMessage(msg);
	}
}
</pre><pre name="code" class="java">
/**
 * @作者 杨铭;
 * @时间 2015年6月18日_下午7:10:35;
 * @联系qq   <771365380>\<286384491>;
 */
package a14.yangming.test_handlermessagelooper;

import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class Handler_MainThread extends Handler
{
	private  TextView tv_main;
	public Handler_MainThread(TextView tv)
	{
		this.tv_main = tv;
	}
	@Override
	public void handleMessage(Message msg)
	{
		switch (msg.what)
		{
			case 1:
				this.tv_main.setText("主线程收到消息");
				break;
			case 2:
				this.tv_main.setText(tv_main.getText()+"收到了非本类对象的消息");
				break;
			case 3:

				break;

			default:
				super.handleMessage(msg);//把我们不关心的消息交给系统处理<做法很好>
				break;
		}
	}
}
</pre><pre name="code" class="java">
package a14.yangming.test_handlermessagelooper;

import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.widget.TextView;

public class MainActivity extends Activity
{
	private TextView tv_mainThread;
	private Handler_MainThread myHandler;
	private Handler_Main_Thread my_Handler;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		init();
		test();
	}

	private void init()
	{
		tv_mainThread = (TextView) findViewById(R.id.tv_mainThread);
		myHandler = new Handler_MainThread(tv_mainThread);
		my_Handler = new Handler_Main_Thread(this);
	}

	private void test()
	{
		Message myMessage = Message.obtain();// Google鼓励使用Message.obtain()或Handler.obtainMessage()获取Message对象
		myMessage.what = 1;
		myHandler.sendMessage(myMessage);
		
		Message myMessage2 = Message.obtain();
		myMessage2.what=2;
		my_Handler.sendMessage(myMessage2);
	}

}



接下来新开一条线程看看

问题是 新开的线程中 

加入:

Looper.prepare();

Looper.loop();

这两句话的作用是什么?,先不用它。


新建一个文件

/**
 * @作者 杨铭;
 * @时间 2015年6月18日_下午7:27:30;
 * @联系qq   <771365380>\<286384491>;
 */
package a14.yangming.test_handlermessagelooper;

import android.os.Handler;
import android.os.Message;

public class ThreadFirst extends Thread
{
	/** 调用此线程者的 一个 handler 对象 */
	private Handler handler;

	public ThreadFirst(Handler handler)
	{
		this.handler = handler;
	}

	@Override
	public void run()
	{
		Message message1 = handler.obtainMessage();
		message1.what = 3;
		handler.sendMessage(message1);
	}
}

对之前的

MainActivity 做出修改

private void test()
	{
		Message myMessage = Message.obtain();// android鼓励使用Message.obtain()或Handler.obtainMessage()获取Message对象
		myMessage.what = 1;
		myHandler.sendMessage(myMessage);
		
		Message myMessage2 = Message.obtain();
		myMessage2.what=2;
		my_Handler.sendMessage(myMessage2);
		
		new ThreadFirst(myHandler).start();
	}


Handler_MainThread 做出修改

	@Override
	public void handleMessage(Message msg)
	{
		switch (msg.what)
		{
			case 1:
				this.tv_main.setText("主线程收到消息");
				break;
			case 2:
				this.tv_main.setText(tv_main.getText()+"收到了非本类对象的消息");
				break;
			case 3:
				this.tv_main.setText(tv_main.getText()+"草泥马");
				break;

			default:
				super.handleMessage(msg);//把我们不关心的消息交给系统处理<做法很好>
				break;
		}
	}



关于那两句话:是用于自己创建的线程的,从API【Handler Looper Message(一)】 可以知道:自己创建的线程中默认没有Looper 


新建文件

/**
 * @作者 杨铭;
 * @时间 2015年6月19日_上午8:41:53;
 * @联系qq   <771365380>\<286384491>;
 */
package a14.yangming.test_handlermessagelooper;

import android.os.Handler;
import android.os.Message;

public class HandlerWithThreadSecond extends Handler
{
	@Override
	public void handleMessage(Message msg)
	{
		switch (msg.what)
		{
			case 4:
				System.out.println("我的 线程中的Handler 收到消息");
				break;

			default:
				break;
		}
		super.handleMessage(msg);
	}
}


</pre><pre name="code" class="java">package a14.yangming.test_handlermessagelooper;

import android.os.Looper;
import android.os.Message;

public class ThreadSecond extends Thread
{
	@Override
	public void run()
	{
		HandlerWithThreadSecond handlerWithThreadSecond = new HandlerWithThreadSecond();
		Message message = Message.obtain();
		message.what = 4;
		handlerWithThreadSecond.sendMessage(message);
	}
}

</pre>MainActivity 中 test() 方法 加入  new ThreadSecond().start();<p></p><p></p><p>运行会报错:<span style="color:#ff0000">java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()</span></p><p>接下来把 </p><pre name="code" class="java">ThreadSecond 修改为:
<pre name="code" class="java">package a14.yangming.test_handlermessagelooper;

import android.os.Looper;
import android.os.Message;

public class ThreadSecond extends Thread
{
	@Override
	public void run()
	{
		Looper.prepare();
		HandlerWithThreadSecond handlerWithThreadSecond = new HandlerWithThreadSecond();
		Message message = Message.obtain();
		message.what = 4;
		handlerWithThreadSecond.sendMessage(message);
		Looper.loop();
	}
}


 
 

就可以再线程之间传递消息了——以上都是线程自己给自己发消息:

接下来线程之间传递消息

仅仅实现了自建线程向主线程的消息传送,但是主线程向自建线程的消息传送却因为线程过快的结束了自己的生命而报出空指针错误,希望懂得大侠给出评论啊

自建线程·向主线程传递消息:

package a14.yangming.test_handlermessagelooper;

import android.os.Looper;
import android.os.Message;

public class ThreadSecond extends Thread
{
	@Override
	public void run()
	{
		Looper.prepare();
		HandlerWithThreadSecond handlerWithThreadSecond = new HandlerWithThreadSecond();
		Message message = Message.obtain();
		message.what = 4;
		handlerWithThreadSecond.sendMessage(message);
		Looper.loop();
	}
}

/**
 * @作者 杨铭;
 * @时间 2015年6月19日_上午9:27:45;
 * @联系qq   <771365380>\<286384491>;
 */
package a14.yangming.test_handlermessagelooper;

import android.os.Handler;
import android.os.Message;

public class HandlerWithMain extends Handler
{
	@Override
	public void handleMessage(Message msg)
	{
		switch (msg.what)
		{
			case 1:
				System.out.println("我是服务于主线程的Handler 我收到来自自建线程的消息");
				break;

			default:
				super.handleMessage(msg);
				break;
		}
	}
}

/**
 * @作者 杨铭;
 * @时间 2015年6月19日_上午8:41:17;
 * @联系qq   <771365380>\<286384491>;
 */
package a14.yangming.test_handlermessagelooper;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;

public class ThreadSecond extends Thread
{
	/**向主线程发送消息的Handler*/
	private Handler mainHandler;
	/**自己的 Hanlder*/
	private HandlerWithThreadSecond threadHandler;
	public ThreadSecond(Handler yourHandler)
	{
		mainHandler = yourHandler;
	}
	@Override
	public void run()
	{
		Message mainMessage = Message.obtain();
		mainMessage.what=1;
		mainHandler.sendMessage(mainMessage);
//		Looper.prepare();
//		threadHandler=new HandlerWithThreadSecond();
//		Looper.loop();
	}
//	
//	public HandlerWithThreadSecond getHandler()
//	{
//		return this.threadHandler;
//	}
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值