`

Android Message机制

 
阅读更多

参考链接http://www.cnblogs.com/hnrainll/archive/2012/01/06/2314863.html

 

 

package com.test.messagedemo;

import android.R.string;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.support.v4.app.NavUtils;

public class MainActivity extends Activity {
	private Button btn1,btn2,btn3,btn4;
	private TextView tv1,tv2,tv3,tv4;
	private static final String TAG = "Thread Id:";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn1=(Button)findViewById(R.id.btn1);
        btn1.setOnClickListener(listener);
        tv1=(TextView)findViewById(R.id.tv1);
        btn2=(Button)findViewById(R.id.btn2);
        btn2.setOnClickListener(listener);
        tv2=(TextView)findViewById(R.id.tv2);
        btn3=(Button)findViewById(R.id.btn3);
        btn3.setOnClickListener(listener);
        tv3=(TextView)findViewById(R.id.tv3);
        btn4=(Button)findViewById(R.id.btn4);
        btn4.setOnClickListener(listener);
        tv4=(TextView)findViewById(R.id.tv4);
        
    }
    
    View.OnClickListener listener=new View.OnClickListener()
	{
		
		@Override
		public void onClick(View v)
		{
			// TODO Auto-generated method stub
			switch (v.getId())
			{
			case R.id.btn1://主线程给自己发送消息
				Looper looper;
				looper=Looper.myLooper();//获取当前线程的Looper,现在为主线程				
				EventHandler mHander=new EventHandler(looper);
				mHander.removeMessages(0);//删除队列消息
				String obj="This is main thread's message and received by itself!";
				Message m=mHander.obtainMessage(1, 1, 1, obj);				
				mHander.sendMessage(m);
				//mHander.handleMessage(m);//sendMessage后,Handler会自动调用handleMessage				
				break;
				
			case R.id.btn2://子线程给主线程发送消息
				NoLooperThread noLooperThread=new NoLooperThread();				
				noLooperThread.start();		
				break;
				
			case R.id.btn3://子线程给自己发送消息
				OwnLooperThread ownLooperThread=new OwnLooperThread();
				ownLooperThread.start();
				break;
				
			case R.id.btn4://主线程给子线程发送消息
				ReceiveMessageThread receiveMessageThread=new ReceiveMessageThread();
				receiveMessageThread.start();
				break;

			default:
				break;
			}
			
		}
	};
	
	private class EventHandler extends Handler
	{
    	
		public EventHandler(Looper looper)//这个方法必须写下来,否则这个类用不了
    	{
            super (looper);
            
    	}
		@Override
		public void handleMessage(Message msg)
		{
			// TODO Auto-generated method stub
			switch (msg.what)
			{
			case 1:
				tv1.setText(msg.obj.toString());
						
				break;				
			case 2:
				tv2.setText(msg.obj.toString());			
							
			case 3:
				tv3.setText(msg.obj.toString());
				break;
				
			case 4:
				tv4.setText(msg.obj.toString());
				break;
				
			default:
				break;
			}			
			
		}		
	}
	
	private class NoLooperThread extends Thread
	{
		private EventHandler mNoLooperThreadHandler; 
		@Override
		public void run()
		{
			Looper looper=Looper.getMainLooper();
			mNoLooperThreadHandler=new EventHandler(looper);
			mNoLooperThreadHandler.removeMessages(0);
			String obj="This is the message from otherThread to MainThread!";
			Message m=mNoLooperThreadHandler.obtainMessage(2, 1, 1, obj);
			mNoLooperThreadHandler.sendMessage(m);
			//mNoLooperThreadHandler.handleMessage(m);
			Log.i(TAG, "NoLooperThread id:" + this.getId()); //注意将long型转成String的一个技巧
		}
		
	}
	
    private class OwnLooperThread extends Thread
    {
    	private EventHandler mOwnLooperEventHandler;
		@Override
		public void run()
		{
			// TODO Auto-generated method stub
			Looper.prepare();
			Looper looper=Looper.myLooper();
			mOwnLooperEventHandler=new EventHandler(looper);
			mOwnLooperEventHandler.removeMessages(0);
			String obj="This is message from otherThread and to itself!";
			Message m=mOwnLooperEventHandler.obtainMessage(3, 1, 1, obj);
			mOwnLooperEventHandler.sendMessage(m);
			//mOwnLooperEventHandler.handleMessage(m);
			Log.i(TAG, "ownLooperThread id:" + this.getId()); 
		}
    	
    }

    private class ReceiveMessageThread extends Thread
    {

    	private EventHandler mReceiveMessageHandler;
		@Override
		public void run()
		{
			// TODO Auto-generated method stub
			Looper.prepare();
			Looper looper=Looper.getMainLooper();
			mReceiveMessageHandler=new EventHandler(looper);
			mReceiveMessageHandler.removeMessages(0);
			String obj="This is message from MainThread  to OtherThread!";
			Message m=mReceiveMessageHandler.obtainMessage(4, 1, 1, obj);
			mReceiveMessageHandler.sendMessage(m);	
			Log.i(TAG, "ReceiveLooperThread id:" + this.getId()); 		
			
		}
    	
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    
}
 
分享到:
评论

相关推荐

    Android的Message机制(Handler、Message、Looper)

    对于Android的Message机制主要涉及到三个主要的类,分别是Handler、Message、Looper;首先对每个类做一个简单介绍;然后再介绍所谓的Android的Message机制是如何实现的,最后给了一个示例。

    Android线程间通信的Message机制

    Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制

    Android的消息处理机制--Message,MessageQueue

    详细描述了Android的消息处理机制,Message和MessageQueue类的详解

    Android中的Message机制

    Android中的Message机制,对消息机制的详细描述。

    Android中Message机制的灵活应用(二)

    NULL 博文链接:https://kevin2562.iteye.com/blog/687081

    Android Message

    Android中的Handler的消息机制

    android多线程handler/message机制详解

    主要对handler 、message机制进行了详解,如果想了解更多android相关知识,可以去我博客看看

    android 消息机制

    从源码出发,详细的解析了android中的消息机制,分析清楚Looper和MessageQueue以及Handler三者之间的关系。

    android消息机制

    android 消息机制 深入理解android的消息机制 更好开发

    Android handler message奇怪用法详解

    android的多线程消息处理机制核心成员handler,基本用法很简单,相关资料也很多。本例子给大家带来handler的奇葩用法,与大家一起分享。

    Android消息处理机制之Message 二

    Android 消息处理机制之 Message 中 obtain()源代码剖析 http://blog.csdn.net/ahuier/article/details/17012923

    android多线程机制

    android多线程机制教程 android多线程机制 android多线程机制 android多线程机制

    android handlerMessage 消息机制

    loop()方法是个死循环,将会不停的从MessageQueue对象中获取Message对象,如果MessageQueue 对象中不存在Message对象,则结束本次循环;最终将会执行handleMessage()方法,也就是我们ServiceHandler类中复写的方法。...

    android的消息处理机制(图+源码分析)——Looper,Handler,Message

    这不, 前几天为了了解android的消息处理机制, 我看 了Looper, Handler, Message这几个类的源码, 结果又一次被googler的设计震撼了, 特与大家分享。 android的消息处理有三个核心类: Looper,Handler和Message...

    Android Handler Looper Message 使用示例

    程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按按钮后,会等待3s后显示VIEW才会有打印输出,如果理解了Looper的同步机制后,可以删除3s等待和主线程...

    android消息机制中几个类的源码

    Handler,Looper,MessageQueue,Message几个类的.java文件 方便深入了解android消息机制

    android+多线程机制的讲解和例子

    4.线程:UI thread通常就是main thread,而Android启动程序时会替它建立一个Message Queue。 每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收...

    Android7.0 MessageQueue详解

    Android中的消息处理机制大量依赖于Handler。每个Handler都有对应的Looper,用于不断地从对应的MessageQueue中取出消息处理。 一直以来,觉得MessageQueue应该是Java层的抽象,然而事实上MessageQueue的主要部分在...

    Android代码-Android 一些重要知识点解析整理

    Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 Android消息循环分析 Android Activity developer 官网 (强烈推荐 dev guide) Android的启动模式(android:launchMode) ...

    Android消息机制理解及延伸

    (请使用UTF-8编码阅读)全面介绍Android的消息处理机制,包括Handler、Looper、Message等,并深入到代码细节进行细致讲解。对于延伸的知识也一并涉及并讲解,使读者真正吃透。保证物超所值!

Global site tag (gtag.js) - Google Analytics