`

Android之Handler详解(二)

 
阅读更多

二:sendMessage版本的Handler的使用

这里介绍几种模型:

a、默认的Handler(消息处理队列挂在主线程上)

 

package com.dxyh.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity
				  implements OnClickListener {
	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 Button btnStart = null;
	private Button btnStop = null;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnStart = (Button) findViewById(R.id.btn_start);
        btnStart.setOnClickListener(this);
        btnStop = (Button) findViewById(R.id.btn_stop);
        btnStop.setOnClickListener(this);
        
        Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]");
    }
    
    Handler mHandler = new Handler() {
    	// 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框
    	@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");
    			finish();
    			break;
    		}
    		super.handleMessage(msg);
    	}
    };
    
    public void onClick(View view) {
    	switch (view.getId()) {
    	case R.id.btn_start:
    		// 启动任务(消息只有标识,立即投递)
    		mHandler.sendEmptyMessage(TASK_BEGIN);
    		Log.i(TAG, "Send TASK_BEGIN to handler.");
    		
    		// 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)
    		Message msg1 = mHandler.obtainMessage(TASK_1);
    		msg1.obj = "This is task1";
    		mHandler.sendMessage(msg1);
    		Log.i(TAG, "Send TASK_1 to handler.");
    		
    		// 开启任务2(和上面类似)
    		Message msg2 = Message.obtain();
    		msg2.arg1 = 10;
    		msg2.arg2 = 20;
    		msg2.what = TASK_2;
    		mHandler.sendMessage(msg2);
    		Log.i(TAG, "Send TASK_2 to handler.");
    		break;
    		
    	case R.id.btn_stop:
    		// 结束任务(空消息体,延时2s投递)
    		mHandler.sendEmptyMessageDelayed(TASK_END, 2000);
    		Log.i(TAG, "Send TASK_END to handler.");
    		break;
    	}
}
}

 

运行结果:

 

b、消息队列仍绑定在主线程上,但在子线程中发送消息。

package com.dxyh.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
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;
	
    /** 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.");
        
        workThread.start();
    }
    
    Handler mHandler = new Handler() {
    	// 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框
    	@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");
    			finish();
    			break;
    		}
    		super.handleMessage(msg);
    	}
    };
    
    Thread workThread = new Thread() {
    	// 你可以在run方法内做任何耗时的操作,然后将结果以消息形式投递到主线程的消息队列中
    	@Override
    	public void run() {
    		// 启动任务(消息只有标识,立即投递)
    		mHandler.sendEmptyMessage(TASK_BEGIN);
    		Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +
    				"Send TASK_START to handler.");
    		
    		// 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)
    		Message msg1 = mHandler.obtainMessage(TASK_1);
    		msg1.obj = "This is task1";
    		mHandler.sendMessage(msg1);
    		Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +
    				"Send TASK_1 to handler.");
    		
    		// 开启任务2(和上面类似)
    		Message msg2 = Message.obtain();
    		msg2.arg1 = 10;
    		msg2.arg2 = 20;
    		msg2.what = TASK_2;
    		mHandler.sendMessage(msg2);
    		Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +
    				"Send TASK_2 to handler.");
    		
    		// 结束任务(空消息体,延时2s投递)
    		mHandler.sendEmptyMessageDelayed(TASK_END, 2000);
    		Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +
    				"Send TASK_END to handler.");
    	}
    };
}

 

运行结果:

分享到:
评论

相关推荐

    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是Android系统中用于线程间通信的关键组件,它的内部实现原理涉及到Thread、MessageQueue和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平台上的应用程序开发的相关知识和技术。虽然提供的部分内容似乎并不包含具体的信息,...

    Android优化技术详解

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

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

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

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

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

    Message,MessageQueue,Looper,Handler详解

    ### Message,MessageQueue,Looper,Handler详解 #### 一、几个关键概念 ##### 1、MessageQueue:消息队列 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应用的生命周期管理是源码分析的重要部分。每个组件都有其特定的生命周期方法,如onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()等。通过源码,我们可以看到这些方法如何被调用...

    handler详解

    Handler是Android系统中用于处理异步消息的核心组件,它的主要职责是协调线程间的通信,尤其是在主线程(UI线程)与工作线程之间。在Android应用开发中,由于主线程负责更新用户界面,因此任何长时间运行的任务都...

Global site tag (gtag.js) - Google Analytics