`
zhenzxie
  • 浏览: 68097 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android学习之路——2.Handler常用的使用方法

阅读更多
 
package zhenz.exercise;

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

public class ExerciseActivity extends Activity {

	/**
	 * 缺省构造方法
	 */
	private Handler mHandler_1 = new Handler();

	/**
	 * 继承Handler,实现自己的handlerMessage()方法
	 */
	private Handler mHandler_2 = new Handler() {

		@Override
		public void handleMessage(Message msg) {

			switch (msg.what) {
				case 0:
					Log.i("mHandler_2",
					        "mHandler_2 ,the current Thread's id is:"
					                + Thread.currentThread().getId());
					break;
				case 1:
					Log.i("mHandler_2",
					        "mHandler_2 ,the current Thread's id is:"
					                + Thread.currentThread().getId());
					break;
			}

		}
	};

	/**
	 * 含Handler.Callback参数的构造方法
	 */
	private Handler mHandler_3 = new Handler(new Handler.Callback() {

		@Override
		public boolean handleMessage(Message msg) {

			Log.i("mHandler_3", "mHandler_3 ,the current Thread's id is:"
			        + Thread.currentThread().getId());

			return false;
		}
	});
	
	/**
	 * Looper和handlerThread为下面在主线程外使用Handler做准备。
	 */
	private Looper mLooper;
	
	private HandlerThread handlerThread = new HandlerThread("HandlerThread");
	{
		handlerThread.start();//一定要先调用start方法
		mLooper = handlerThread.getLooper();
	}
	/**
	 * 含Looper参数的构造方法
	 */
	private Handler mHandler_4 = new Handler(
	        mLooper);

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Log.i("Main", "Main,the current Thread's id is:"
		        + Thread.currentThread().getId());
		// Handler中其他的post方法类似。
		boolean done = mHandler_1.postAtTime(new Runnable() {

			@Override
			public void run() {

				Log.i("mHandler_1", "mHandler_1 ,the current Thread's id is:"
				        + Thread.currentThread().getId());
			}

		}, 1000L);
		if (done) {//一
			Log.i("mHandler_1",
			        "Runnable was successfully placed in to the message queue in the mHandler_1");
		}

		// Handler中其他的sendMessage方法类似
		mHandler_2.sendEmptyMessageDelayed(0, 1000L);

		// 不同线程通过mHandler_2和主线程通信
		Thread thread = new Thread(new Runnable() {

			@Override
			public void run() {
				Log.i("thread", "thread ,the current Thread's id is:"
				        + Thread.currentThread().getId());
				mHandler_2.sendEmptyMessageDelayed(1, 1000L);
			}
		});
		thread.start();

		// 使用Message来传递数据
		Message message = Message.obtain(null, 1, 2, 3, "Message 1");
		message.setTarget(mHandler_3);
		message.sendToTarget();

		// Handler中其他的post方法类似,不在主线程中处理事物
		boolean can = mHandler_4.postAtTime(new Runnable() {

			@Override
			public void run() {//二

				Log.i("mHandler_4", "mHandler_4 ,the current Thread's id is:"
				        + Thread.currentThread().getId());
			}

		}, 1000L);
		if (can) {//三
			Log.i("mHandler_4",
			        "Runnable was successfully placed in to the message queue in the mHandler_4");
		}

	}
}
由上图的信息可以知道程序处理消息的顺序(有些设置了延时,消息处理的顺序应该是基于时间)以及消息是在哪个线程处理的。
看到第二和第四条信息是不同的。
(一)从第一条信息可以知道主线程的id是1。

(二)从第二条信息可以知道了程序已经执行到“一”处了,并且匿名Runnable对象已经成功post到mHandler_1的处理消息队列中(这个消息队列应该是主消息队列),一秒后就大概会执行了。

(三)从第三条信息可以知道程序执行“二”处,这是因为在对象初始化块那里已经调用了HandlerThread对象的start方法,并把这个对象持有的Looper对象传递给了mHandler_4的构造方法。

(四)从第四条信息可以知道程序执行到“三”处,并且匿名Runnable对象已经成功post到mHandler_4的处理消息队列中(这个消息队列应该是HandlerThread对象的消息队列),一秒后就大概会执行了。到这里主线程的程序执行完了,就等着处理在前面入到主线程消息队列的消息了。

(五)从第五条信息可以知道主线程中开启的thread线程执行了。不过这里mHandler_2又把一个消息加到主线程的消息队列中了,这样不就实现了不同线程之间的通信了。这个方法可以用来通知UI线程刷新组件。

(六)从六到九条信息可以知道刚刚不管是Runnable对象还是Message,只要Handler是属于主线程的,那么处理这些事务都是在主线程当中进行的。

(七)第八条和第九条是一样的,本来是想说明Message中what域的作用的,结果虽然用switch来区分不同的Message,但是忘了把what输出来了。
分享到:
评论

相关推荐

    安卓Android源码——ToastSample.rar

    在Android开发中,`Toast`是开发者常用的UI组件之一,用于显示短暂的提示信息。`ToastSample`是一个典型的Android应用示例,它展示了如何在Android程序中创建、定制和显示`Toast`。通过分析`ToastSample`的源码,...

    安卓Android源码——SpeechRecorder.rar

    2. **MediaRecorder类**:另一个常用的录音API是`MediaRecorder`,它提供了更高级别的接口,适合大多数应用场景。`MediaRecorder`可以配置输出文件的格式(如MP3或AAC),并且自动处理编码、缓冲和文件写入等操作。 ...

    安卓Android源码——HandlerMessage1.rar

    2. **post() 和 sendMessage()**:这两个方法是向 `Handler` 发送 `Message` 的常用方式,区别在于 `post()` 可以直接传递一个 `Runnable` 对象,而 `sendMessage()` 需要创建 `Message`。 3. **handleMessage()**:...

    Google.Android开发入门与实战第12章.Android综合案例一——RSS阅读器实例

    在本章节中,“Google.Android开发入门与实战第12章.Android综合案例一——RSS阅读器实例”主要聚焦于Android应用程序开发中的一个实际应用场景——构建一个RSS阅读器。这个实例将帮助初学者理解如何将Android SDK的...

    Android源码——图片浏览源码.7z

    通过分析"Android源码——图片浏览源码.7z"中的代码,开发者可以学习到以上这些技术,并结合实际项目进行应用和改进。这份源码应该包含了实现图片浏览功能的完整流程,包括图片加载、手势识别、动画效果以及性能优化...

    安卓Android源码——阿拉丁天气.zip

    7. **异步处理**:Android应用通常使用AsyncTask或者Handler/Looper机制进行后台任务处理,以避免阻塞主线程。在阿拉丁天气中,可能有异步加载天气信息的示例。 8. **权限动态申请**:对于Android 6.0及以上版本,...

    安卓Android源码——公交查询.zip

    10. **异步处理**:考虑到网络请求和地理位置获取可能会耗时,应用通常会使用AsyncTask、Handler、IntentService或者现代的Coroutines来执行这些操作,避免阻塞主线程导致UI卡顿。 11. **测试与调试**:应用开发...

    安卓Android源码——精品生活.zip

    9. **异步处理**:Android使用`AsyncTask`、`Handler`、`Thread`或现代的`Coroutines`、`LiveData`和`ViewModel`来处理耗时操作,防止阻塞主线程。 10. **测试与调试**:单元测试、集成测试和UI测试是保证代码质量...

    安卓Android源码——欢迎引导页面.rar

    本压缩包“安卓Android源码——欢迎引导页面.rar”包含了一个实现此类功能的源码示例,我们可以从中学习到以下几个关键知识点: 1. **SplashActivity**:这是欢迎引导页面的主要活动类。它通常会有一个自定义布局,...

    Android源码——图书书架源码.zip

    《Android源码——图书书架源码》是一个关于Android应用开发的资源包,主要展示了如何在Android平台上实现图书书架的界面与功能。这个压缩包包含了一些图片资源和核心源代码,下面将对其中涉及的关键知识点进行详细...

    安卓Android源码——博客园客户端.zip

    《深入剖析Android源码——以博客园客户端为例》 Android作为一个开源的操作系统,其源码是开发者探索移动应用开发的宝库。博客园客户端作为一款广受欢迎的应用,其源码同样蕴含了丰富的Android开发知识。本文将从...

    安卓Android源码——音乐播放器.zip

    【安卓Android源码——音乐播放器】 在安卓平台上开发音乐播放器是一项常见的任务,涉及到许多核心的Android技术。本项目提供了这样一个音乐播放器的源代码,对于开发者来说,这是一个很好的学习资源,可以深入理解...

    安卓Android源码——ListView下拉刷新 Demo.zip

    本示例“安卓Android源码——ListView下拉刷新 Demo.zip”提供了一个具体的实现,帮助开发者理解和实现这一功能。 首先,我们要了解下拉刷新的基本原理。下拉刷新通常由两部分组成:UI动画和数据加载逻辑。UI动画是...

    安卓Android源码——一个短信源码.rar

    "安卓"是Android在中国的常用称呼,"源码"意味着我们可以看到程序的原始编程语言,这对学习和调试Android应用非常有帮助。 【压缩包子文件的文件名称列表】: 1. **JavaApk源码说明.txt** - 这可能是一个文档,详细...

    安卓Android源码——android访问网络返回json解析和Hanlder的使用.zip

    本资源"安卓Android源码——android访问网络返回json解析和Hanlder的使用.zip"聚焦于两个核心概念:网络请求与数据解析,以及Handler的使用。我们将深入探讨这两个方面。 首先,Android中的网络访问是应用程序与...

    安卓Android源码——仿赶集生活android客户端的介绍动画界面.zip

    这个"安卓Android源码——仿赶集生活android客户端的介绍动画界面.zip"是一个示例项目,展示了如何模仿赶集生活Android客户端的启动介绍动画效果。下面将详细探讨相关知识点: 1. **自定义启动页**: Android 应用...

    安卓Android源码——oschina--app.zip

    《安卓Android源码解析——oschina-app》 在移动开发领域,Android系统因其开源特性而备受开发者喜爱。本文将深入探讨“oschina-android-app”这一特定的安卓应用源码,帮助开发者理解其背后的架构设计、功能实现...

    Android源码——电影简介分析源码.zip

    通过这个项目,开发者可以深入理解Android应用的开发流程,学习如何从网络获取数据、解析数据、展示数据以及处理用户交互,同时也能熟悉Android开发的常用工具和库。这将对提升Android开发技能大有裨益。

    Android源码——掌上几分钟视频应用源码.zip

    【Android源码——掌上几分钟视频应用源码.zip】是一个包含Android应用程序源代码的压缩文件,主要用于学习和研究Android平台上短视频应用的开发。这个源码提供了掌上几分钟视频应用的完整实现,帮助开发者深入理解...

    安卓Android源码——安卓Android快速框架+多线程下载框架的技术.rar

    本资源"安卓Android源码——安卓Android快速框架+多线程下载框架的技术"提供了深入理解Android平台下的应用程序开发,特别是涉及到Afinal和Gson这两个关键库的使用。下面我们将详细探讨这些知识点。 一、Android...

Global site tag (gtag.js) - Google Analytics