`

Android之Handler详解(四)

 
阅读更多

d、自己创建新的线程,然后在新线程中创建Looper,主线程调用子线程中的发消息方法,将消息发给子线程的消息队列。

package com.dxyh.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class MainActivity extends Activity {
	private final static String TAG = "HandlerTest";
	
	private final static int TASK_BEGIN	= 1;
	private final static int TASK_1	= 2;
	private final static int TASK_2	= 3;
	private final static int TASK_END	= 4;
	
	private Handler workHandler = null;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +
        		"This is in main thread.");
        
        LooperThread testThread = new LooperThread();
        testThread.start();
        
        // 注意,这里需要等待一下,防止出现空指针异常
        while (null == workHandler) {
        }
        
        testThread.sendMessageTodoYourWork();
    }
    
    class LooperThread extends Thread {
    	@Override
    	public void run() {
    		Looper.prepare();
    		
    		workHandler = new Handler() {
    			// 现在在每个case之后,你可以做任何耗时的操作了
    	    	@Override
    	    	public void handleMessage(Message msg) {
    	    		switch (msg.what) {
    	    		case TASK_BEGIN:
    	    			Log.i(TAG, "[H_TID:" +
    	    			   Thread.currentThread().getId() + "] Get TASK_BEGIN");
    	    			break;
    	    			
    	    		case TASK_1:
    	    			Log.i(TAG, "[H_TID:" +
    	    			   Thread.currentThread().getId() + "] Get TASK_1");
    	    			break;
    	    			
    	    		case TASK_2:
    	    			Log.i(TAG, "[H_TID:" +
    	    			   Thread.currentThread().getId() + "] Get TASK_2");
    	    			break;
    	    			
    	    		case TASK_END:
    	    			Log.i(TAG, "[H_TID:" +
    	    			   Thread.currentThread().getId() + "] Get TASK_END");
    	    			Looper.myLooper().quit();
    	    			finish();
    	    			break;
    	    		}
    	    		super.handleMessage(msg);
    	    	}
    		};
    		
    		Looper.loop();
    	}
    	
    	public void sendMessageTodoYourWork() {
    		Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +
				"Send TASK_START to handler.");
    		// 启动任务(消息只有标识,立即投递)
    		workHandler.sendEmptyMessage(TASK_BEGIN);

    		Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +
				"Send TASK_1 to handler.");
    		// 开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)
    		Message msg1 = workHandler.obtainMessage(TASK_1);
    		msg1.obj = "This is task1";
    		workHandler.sendMessage(msg1);
    		
    		Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +
				"Send TASK_2 to handler.");    		
    		// 开启任务2(和上面类似)
    		Message msg2 = Message.obtain();
    		msg2.arg1 = 10;
    		msg2.arg2 = 20;
    		msg2.what = TASK_2;
    		workHandler.sendMessage(msg2);

    		Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +
				"Send TASK_END to handler.");
    		// 结束任务(空消息体,延时2s投递)
    		workHandler.sendEmptyMessageDelayed(TASK_END, 2000);
    	}
    }
}

 

运行结果:

e、主/子线程均有一个消息队列,然后相互传递消息(这种方式是最灵活的,双向传递,也不复杂)

package com.dxyh.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class MainActivity extends Activity {
	private final static String TAG = "HandlerTest";
	
	private final static int TASK_BEGIN		= 1;
	private final static int TASK_1		= 2;
	private final static int TASK_2		= 3;
	private final static int TASK_END		= 4;
	
	private final static int TASK_BEGIN_OVER	= 11;
	private final static int TASK_1_OVER	= 12;
	private final static int TASK_2_OVER	= 13;
	private final static int TASK_END_OVER	= 14;
	
	private Handler workHandler = null;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +
        		"This is in main thread.");
        
        LooperThread testThread = new LooperThread();
        testThread.start();
        
        // 注意,这里需要等待一下,防止出现空指针异常
        while (null == workHandler) {
        }
        
        testThread.sendMessageTodoYourWork();
    }
  
    Handler mainHandler = new Handler () {
    	// 在每个case之后,不能做耗时的操作
    	@Override
    	public void handleMessage(Message msg) {
    		switch (msg.what) {
    		case TASK_BEGIN_OVER:
    			Log.i(TAG, "[MH_TID:" +
    				Thread.currentThread().getId() + "] TASK_BEGIN_OVER");
    			break;
    			
    		case TASK_1_OVER:
    			Log.i(TAG, "[MH_TID:" +
    				Thread.currentThread().getId() + "] TASK_1_OVER");
    			break;
    			
    		case TASK_2_OVER:
    			Log.i(TAG, "[MH_TID:" +
    				Thread.currentThread().getId() + "] TASK_2_OVER");
    			break;
    			
    		case TASK_END_OVER:
    			Log.i(TAG, "[MH_TID:" +
    				Thread.currentThread().getId() + "] TASK_END_OVER");
    			finish();
    			break;
    		}
    		super.handleMessage(msg);
    	}
    };
    
    class LooperThread extends Thread {
    	@Override
    	public void run() {
    		Looper.prepare();
    		
    		workHandler = new Handler() {
    			// 现在在每个case之后,你可以做任何耗时的操作了
    	    	@Override
    	    	public void handleMessage(Message msg) {
    	    		switch (msg.what) {
    	    		case TASK_BEGIN:
    	    			Log.i(TAG, "[ZH_TID:" +
    	    			   Thread.currentThread().getId() + "] Get TASK_BEGIN");
    	    			// 做完之后报告信息给主线程
    	    			mainHandler.sendEmptyMessage(TASK_BEGIN_OVER);
    	    			break;
    	    			
    	    		case TASK_1:
    	    			Log.i(TAG, "[ZH_TID:" +
    	    			   Thread.currentThread().getId() + "] Get TASK_1");
    	    			// 做完之后报告信息给主线程
    	    			mainHandler.sendEmptyMessage(TASK_1_OVER);
    	    			break;
    	    			
    	    		case TASK_2:
    	    			Log.i(TAG, "[ZH_TID:" +
    	    			   Thread.currentThread().getId() + "] Get TASK_2");
    	    			// 做完之后报告信息给主线程
    	    			mainHandler.sendEmptyMessage(TASK_2_OVER);
    	    			break;
    	    			
    	    		case TASK_END:
    	    			Log.i(TAG, "[ZH_TID:" +
    	    			   Thread.currentThread().getId() + "] Get TASK_END");
    	    			Looper.myLooper().quit();
    	    			// 做完之后报告信息给主线程
    	    			mainHandler.sendEmptyMessage(TASK_END_OVER);
    	    			Looper.myLooper().quit();
    	    			break;
    	    		}
    	    		super.handleMessage(msg);
    	    	}
    		};
    		
    		Looper.loop();
    	}
    	
    	public void sendMessageTodoYourWork() {
    		Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +
				"Send TASK_START to handler.");
    		// 启动任务(消息只有标识,立即投递)
    		workHandler.sendEmptyMessage(TASK_BEGIN);

    		Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +
				"Send TASK_1 to handler.");
    		// 开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)
    		Message msg1 = workHandler.obtainMessage(TASK_1);
    		msg1.obj = "This is task1";
    		workHandler.sendMessage(msg1);
    		
    		Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +
				"Send TASK_2 to handler.");    		
    		// 开启任务2(和上面类似)
    		Message msg2 = Message.obtain();
    		msg2.arg1 = 10;
    		msg2.arg2 = 20;
    		msg2.what = TASK_2;
    		workHandler.sendMessage(msg2);

    		Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +
				"Send TASK_END to handler.");
    		// 结束任务(空消息体,延时2s投递)
    		workHandler.sendEmptyMessageDelayed(TASK_END, 2000);
    	}
    }
}

 以上一到四均摘自:http://blog.csdn.net/dengxiayehu

 

 

分享到:
评论

相关推荐

    Android_Handler详解(一)

    【Android_Handler详解(一)】 在Android开发中,Handler是一个至关重要的组件,它与线程、消息队列和Looper紧密关联,用于实现不同线程间的通信。本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的...

    Android Handler类详解

    Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解

    android多线程handler/message机制详解

    Android 多线程Handler/Message机制详解 Android 多线程机制是 Android 应用程序中最重要的组件之一,它允许应用程序在后台执行一些操作,而不影响用户的交互体验。在 Android 中,多线程机制是基于 Handler 和 ...

    Android Handler详解-中国移动开发者社区

    Android Handler详解-中国移动开发者社区 Android Handler详解-中国移动开发者社区

    Android开发工程师面试题之handler详解。android程序员,android开发面试资料,详解

    ### Android开发工程师面试题之Handler详解 在Android开发过程中,Handler是进行线程间通信的重要机制之一,尤其在实现异步任务更新UI等场景中扮演着关键角色。本篇文章将围绕Handler的工作原理、核心组件及其实现...

    android-Handler的使用

    【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...

    Android handler message奇怪用法详解

    Handler是Android中的一个类,它用于在不同的线程之间发送和处理消息。通常,我们使用Handler配合Looper和Message来实现在主线程(UI线程)中执行后台任务的结果。Looper是消息队列的循环器,它不断检查消息队列并...

    详解Android中Handler的内部实现原理

    在创建Handler时,有四个构造函数可供选择,它们分别对应不同的初始化方式。前两个构造函数没有显式指定Looper,因此会尝试从当前线程获取默认的Looper;后两个构造函数允许开发者明确指定一个Looper。如果指定了...

    Android创意实例详解书籍源码

    7. **多线程与并发**:Android应用需要处理复杂的多线程场景,源码可能包含Handler、AsyncTask、Thread、Service等的使用,以实现后台任务和避免主线程阻塞。 8. **权限管理**:随着Android系统对权限管理的加强,...

    Handler和looper详解

    Handler和Looper详解 Handler和Looper是Android系统中两个非常重要的组件,它们之间相互关联,共同实现了Android系统中的消息处理机制。在本文中,我们将对Handler和Looper进行详细的解释,并探讨它们在Android系统...

    Android应用开发详解.pdf

    根据提供的标题“Android应用开发详解.pdf”以及描述“Android应用开发详解.pdf”,我们可以推断这份文档主要涵盖了关于Android平台上的应用程序开发的相关知识和技术。虽然提供的部分内容似乎并不包含具体的信息,...

    Message,MessageQueue,Looper,Handler详解

    ### Message,MessageQueue,Looper,Handler详解 #### 一、几个关键概念 ##### 1、MessageQueue:消息队列 MessageQueue是一种数据结构,顾名思义,它充当了一个消息队列的角色,用来存放各种消息对象。每一个线程...

    《Android应用开发详解》源码(全章节)

    《Android应用开发详解》这本书是Android开发者们的重要参考资料,它深入浅出地讲解了Android应用开发的各个环节。源码作为书中的实践部分,是理论知识的直观体现,可以帮助读者更好地理解和掌握Android编程技术。这...

    Android优化技术详解

    "Android优化技术详解"这一主题涵盖了多个方面,旨在帮助开发者构建高效、流畅的应用程序。下面,我们将深入探讨这些关键技术点。 首先,我们要理解Android应用性能的基础——内存管理。Android系统采用Dalvik/ART...

    Android消息机制Handler的工作过程详解

    总结总结 Android的消息机制Handler是线程间通信的关键工具,它允许开发者在后台线程执行耗时操作,而将UI更新交由主线程处理,保证了UI操作的安全性和性能。理解Handler、Looper和MessageQueue的工作原理以及它们...

    Android应用开发详解与代码(清晰版)

    通过深入学习这些知识点,结合《Android应用开发详解与代码(清晰版)》中的实例和实践,新手开发者将能够逐步构建自己的Android应用,开启移动开发之旅。书中可能涵盖了这些概念的详细解释和实际操作步骤,对于渴望...

    Handler与Android多线程详解

    下面是一段大家都比较熟悉的代码: 代码如下:Handler handler = new Handler(); handler.post(myThread); //使用匿名内部类创建一个线程myThreadRunnable mythread = new Runnable() {public void run() {}};一开始...

    Android Handler运行原理

    ### Android Handler运行原理详解 #### 一、引言 在Android开发中,线程间通信是非常重要的技术之一,其中Handler机制被广泛应用于实现主线程与子线程之间的数据交互。Handler机制不仅简单易用,而且功能强大,是...

    Android应用开发详解源码全

    第四,Android应用的数据存储通常涉及SQLite数据库、SharedPreferences、ContentProvider等。源码中会展示如何操作数据库,如何读写数据,以及如何通过ContentProvider与其他应用共享数据。 第五,网络通信是现代...

    android线程消息机制之Handler详解

    Android线程消息机制是Android应用开发中的核心组件之一,它允许开发者在不同的线程之间进行通信,特别是子线程与主线程之间的交互。这一机制主要由Handler、Looper、Message和MessageQueue四个关键类组成。 **...

Global site tag (gtag.js) - Google Analytics