`
marine8888
  • 浏览: 544471 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android----Thread+Handler 线程 消息循环(转载)

阅读更多

近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子。

 andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。

在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle,我们有消息循环,就要往消息循环里 面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,消息的的处理,把这些都封装在Handle里面,注意Handle只是针对那 些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。
但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。
  在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个是android的新概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handler,我们有消息循环,就要往消息循环里面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,把这些都封装在Handler里面,注意Handler只是针对那 些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。

但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。


  一个Handler的创建它就会被绑定到这个线程的消息队列中,如果是在主线程创建的,那就不需要写代码来创建消息队列了,默认的消息队列会在主线程被创建。但是如果是在子线程的话,就必须在创建Handler之前先初始化线程的消息队列。如下面的代码:

class ChildThread extends Thread {

    public void run() {

        /*
         * 创建 handler前先初始化Looper.
         */
        Looper.prepare();

        /*
         * 在子线程创建handler,所以会绑定到子线程的消息队列中
         *
         */
        mChildHandler = new Handler() {

            public void handleMessage(Message msg) {

                /*
                 * Do some expensive operations there.
                 */
            }
        };

        /*
         * 启动该线程的消息队列
         */
        Looper.loop();
    }
}

 



当Handler收到消息后,就会运行handleMessage(…)的回调函数,可以在里面做一些耗时的操作。




最后完成了操作要结束子线程时,记得调用quit()来结束消息循环队列。

mChildHandler.getLooper().quit();



下面是一个线程间通信的小例子:

/**
 * 
 * @author allin.dev 
 * http://allin.cnblogs.com
 * 
 */
public class MainThread extends Activity {

	private static final String TAG = "MainThread";
	private Handler mMainHandler, mChildHandler;
	private TextView info;
	private Button msgBtn;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		info = (TextView) findViewById(R.id.info);
		msgBtn = (Button) findViewById(R.id.msgBtn);

		mMainHandler = new Handler() {

			@Override
			public void handleMessage(Message msg) {
				Log.i(TAG, "Got an incoming message from the child thread - "
						+ (String) msg.obj);
				// 接收子线程的消息
				info.setText((String) msg.obj);
			}

		};

		new ChildThread().start();
		
		
		msgBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				
				if (mChildHandler != null) {
					
					//发送消息给子线程
					Message childMsg = mChildHandler.obtainMessage();
					childMsg.obj = mMainHandler.getLooper().getThread().getName() + " says Hello";
					mChildHandler.sendMessage(childMsg);
					
					Log.i(TAG, "Send a message to the child thread - " + (String)childMsg.obj);


				}
			}
		});

	}

	public void onDestroy() {
      super.onDestroy();
		Log.i(TAG, "Stop looping the child thread's message queue");

		mChildHandler.getLooper().quit();
	}

	class ChildThread extends Thread {

		private static final String CHILD_TAG = "ChildThread";

		public void run() {
			this.setName("ChildThread");

			//初始化消息循环队列,需要在Handler创建之前
			Looper.prepare();

			mChildHandler = new Handler() {
				@Override
				public void handleMessage(Message msg) {
					 Log.i(CHILD_TAG, "Got an incoming message from the main thread - " + (String)msg.obj);


					try {

						//在子线程中可以做一些耗时的工作
						sleep(100);

						Message toMain = mMainHandler.obtainMessage();
						toMain.obj = "This is " + this.getLooper().getThread().getName() +
									".  Did you send me \"" + (String)msg.obj + "\"?";

						mMainHandler.sendMessage(toMain);

						Log.i(CHILD_TAG, "Send a message to the main thread - " + (String)toMain.obj);

					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

			};

			Log.i(CHILD_TAG, "Child handler is bound to - "+ mChildHandler.getLooper().getThread().getName());

			//启动子线程消息循环队列
			Looper.loop();
		}
	}
}

 

分享到:
评论
3 楼 难得糊涂CN2010 2014-01-03  
思路很清晰!
2 楼 renmin520 2012-02-29  
好资料
谢谢分享
谢谢
1 楼 qiuxianxiang 2011-03-24  
[img][/img]

相关推荐

    ndroid异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    为了解决这个问题,Android提供了多种异步处理机制,其中一种常见的方式是使用`Thread`配合`Handler`来实现非UI线程执行耗时任务并更新UI。本篇将详细介绍这一方法。 首先,我们需要理解Android的线程模型。Android...

    Android Handler线程间的调度

    本文将深入探讨“Android Handler线程间的调度”这一主题,并结合提供的资源——MessageProject,来阐述相关知识点。 首先,Handler是Android中的一个关键类,它允许开发者在不同的线程之间发送和处理消息。Handler...

    Android线程模式(handler,thread,looper)

    总结一下,Android的Handler-Thread-Looper模型是多线程通信的关键,通过Handler发送消息,Thread执行后台任务,Looper负责消息的调度,共同保证了UI线程的流畅性和应用程序的高效运行。开发者应当熟练掌握这些概念...

    android 线程之间通过Handler发送消息

    然而,由于Android UI操作必须在主线程中执行,因此我们需要一种机制来在不同线程间传递消息,这就是Handler的作用。本文将深入探讨Android中如何通过Handler实现线程间的通信。 首先,理解Android线程模型至关重要...

    Android----线程实现图片移动

    1. **创建线程**: 可以使用`Thread`类直接创建一个新线程,或者使用更现代的`AsyncTask`,`Handler`/`Looper`,或者`Runnable`与`ExecutorService`。考虑到这是一个简单的任务,`Thread`或`Runnable`配合`Looper`...

    android+threadhandler AsyncTask

    通过Looper(消息循环)和Message(消息对象),Handler可以在适当的线程上执行特定的操作。 实现步骤: 1. 在主线程中创建Handler对象。 2. 在子线程中创建Runnable对象,执行下载图片的任务,并在任务完成后...

    Android 之 Looper、MessageQueue、Handler 与消息循环

    ### Android之Looper、MessageQueue、Handler与消息循环详解 #### 一、概述 在Android开发过程中,消息处理机制是至关重要的部分,它涉及到应用程序如何管理、传递和响应各种事件。本篇文章将深入探讨Android中...

    Handler + Thread + Looper

    在Android应用开发中,Handler、Thread和Looper是三个至关重要的组件,它们共同构成了Android线程间通信的基础架构。本文将详细解析这三个概念及其相互关系,旨在帮助开发者理解它们的工作原理和实际应用场景。 ...

    android 更新 UI 线程 handler

    在上述代码中,我们首先在主线程中创建了一个Handler,并指定了它的Looper,即主线程的消息循环器。然后在工作线程中,我们执行耗时操作,并在完成后创建一个Runnable对象,通过Handler的`sendMessage()`方法将消息...

    Android Handler 线程 示例代码

    在Android开发中,`Handler`、`Thread`、`Toast`、`消息队列`以及`线程`是实现UI交互和异步处理的关键概念。本文将深入探讨这些概念,并结合给定的"Android Handler 线程 示例代码"进行详细讲解。 首先,我们来看`...

    Android_Handler的线程队列Demo

    Handler是Android中的一个关键类,它允许开发者在不同的线程之间发送和处理消息。通常,主线程负责更新UI,而其他工作线程则执行耗时操作。Handler就是连接这两者的桥梁,通过发送Message对象到消息队列,由Looper...

    Android Thread Handler

    在Android应用开发中,线程(Thread)和Handler是实现多任务并行处理以及界面更新的关键组件。Android系统是一个单线程模型,主线程(UI线程)负责处理用户交互和绘制界面,而其他工作通常需要在后台线程中执行,以...

    handler加线程模式实现android应用的异步加载

    首先,Handler是Android消息机制的核心组件,它负责处理由Looper循环器分发的消息。在主线程中创建一个Handler,然后在子线程中通过这个Handler发送消息,这样就可以实现在子线程执行任务,主线程更新UI的操作。 1....

    handler线程

    ### Handler线程在Android中的应用及心得 #### 一、Handler机制概述 Handler机制是Android系统中用于处理消息和线程通信的重要组成部分。它主要由四个核心组件组成:`Looper`、`Handler`、`MessageQueue` 和 `...

    Handler+Thread

    在Android应用开发中,`Handler` 和 `Thread` 是两个非常关键的概念,它们主要用于处理线程间的通信和异步操作。下面将详细解释这两个概念,以及如何在实际应用中使用它们来实现简单的网络图片获取和显示。 首先,`...

    Android多线程及异步任务消息处理机制 一 Handler的使用

    `Looper`是消息循环器,它在后台线程运行,不断从消息队列中取出消息交给`Handler`处理。主线程默认已经有一个`Looper`,而子线程需要手动调用`Looper.prepare()`和`Looper.loop()`启动消息循环。 5. **异步任务**...

    Android线程操作 handler demo

    Handler是Android中处理消息和回调的核心组件,它与Looper和Message紧密配合,实现了线程间的通信。以下是你需要了解的关键概念: 1. **主线程与工作线程**:Android应用默认有一个主线程,负责处理UI更新和用户...

    Thread_Handler_MessageDownload.zip

    Handler是Android中的消息处理对象,它与Looper(消息循环器)和Message(消息)共同构成了Android的消息传递机制。 Looper是每个线程中的消息队列的管理者,通常在主线程中初始化。一旦Looper.prepare()和Looper....

    Android 中三种启用线程的方法总结

    首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...

    关于Thread和Handler的使用(一)

    在Android开发中,Thread和Handler是两个非常关键的概念,它们用于处理线程间通信和UI更新,确保程序的运行效率和用户体验。这篇博客主要探讨了如何有效地使用Thread和Handler进行多线程操作。 首先,Thread在Java...

Global site tag (gtag.js) - Google Analytics