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开发中,`Toast`是开发者常用的UI组件之一,用于显示短暂的提示信息。`ToastSample`是一个典型的Android应用示例,它展示了如何在Android程序中创建、定制和显示`Toast`。通过分析`ToastSample`的源码,...
2. **MediaRecorder类**:另一个常用的录音API是`MediaRecorder`,它提供了更高级别的接口,适合大多数应用场景。`MediaRecorder`可以配置输出文件的格式(如MP3或AAC),并且自动处理编码、缓冲和文件写入等操作。 ...
2. **post() 和 sendMessage()**:这两个方法是向 `Handler` 发送 `Message` 的常用方式,区别在于 `post()` 可以直接传递一个 `Runnable` 对象,而 `sendMessage()` 需要创建 `Message`。 3. **handleMessage()**:...
在本章节中,“Google.Android开发入门与实战第12章.Android综合案例一——RSS阅读器实例”主要聚焦于Android应用程序开发中的一个实际应用场景——构建一个RSS阅读器。这个实例将帮助初学者理解如何将Android SDK的...
通过分析"Android源码——图片浏览源码.7z"中的代码,开发者可以学习到以上这些技术,并结合实际项目进行应用和改进。这份源码应该包含了实现图片浏览功能的完整流程,包括图片加载、手势识别、动画效果以及性能优化...
7. **异步处理**:Android应用通常使用AsyncTask或者Handler/Looper机制进行后台任务处理,以避免阻塞主线程。在阿拉丁天气中,可能有异步加载天气信息的示例。 8. **权限动态申请**:对于Android 6.0及以上版本,...
10. **异步处理**:考虑到网络请求和地理位置获取可能会耗时,应用通常会使用AsyncTask、Handler、IntentService或者现代的Coroutines来执行这些操作,避免阻塞主线程导致UI卡顿。 11. **测试与调试**:应用开发...
9. **异步处理**:Android使用`AsyncTask`、`Handler`、`Thread`或现代的`Coroutines`、`LiveData`和`ViewModel`来处理耗时操作,防止阻塞主线程。 10. **测试与调试**:单元测试、集成测试和UI测试是保证代码质量...
本压缩包“安卓Android源码——欢迎引导页面.rar”包含了一个实现此类功能的源码示例,我们可以从中学习到以下几个关键知识点: 1. **SplashActivity**:这是欢迎引导页面的主要活动类。它通常会有一个自定义布局,...
《Android源码——图书书架源码》是一个关于Android应用开发的资源包,主要展示了如何在Android平台上实现图书书架的界面与功能。这个压缩包包含了一些图片资源和核心源代码,下面将对其中涉及的关键知识点进行详细...
《深入剖析Android源码——以博客园客户端为例》 Android作为一个开源的操作系统,其源码是开发者探索移动应用开发的宝库。博客园客户端作为一款广受欢迎的应用,其源码同样蕴含了丰富的Android开发知识。本文将从...
【安卓Android源码——音乐播放器】 在安卓平台上开发音乐播放器是一项常见的任务,涉及到许多核心的Android技术。本项目提供了这样一个音乐播放器的源代码,对于开发者来说,这是一个很好的学习资源,可以深入理解...
本示例“安卓Android源码——ListView下拉刷新 Demo.zip”提供了一个具体的实现,帮助开发者理解和实现这一功能。 首先,我们要了解下拉刷新的基本原理。下拉刷新通常由两部分组成:UI动画和数据加载逻辑。UI动画是...
"安卓"是Android在中国的常用称呼,"源码"意味着我们可以看到程序的原始编程语言,这对学习和调试Android应用非常有帮助。 【压缩包子文件的文件名称列表】: 1. **JavaApk源码说明.txt** - 这可能是一个文档,详细...
本资源"安卓Android源码——android访问网络返回json解析和Hanlder的使用.zip"聚焦于两个核心概念:网络请求与数据解析,以及Handler的使用。我们将深入探讨这两个方面。 首先,Android中的网络访问是应用程序与...
这个"安卓Android源码——仿赶集生活android客户端的介绍动画界面.zip"是一个示例项目,展示了如何模仿赶集生活Android客户端的启动介绍动画效果。下面将详细探讨相关知识点: 1. **自定义启动页**: Android 应用...
《安卓Android源码解析——oschina-app》 在移动开发领域,Android系统因其开源特性而备受开发者喜爱。本文将深入探讨“oschina-android-app”这一特定的安卓应用源码,帮助开发者理解其背后的架构设计、功能实现...
通过这个项目,开发者可以深入理解Android应用的开发流程,学习如何从网络获取数据、解析数据、展示数据以及处理用户交互,同时也能熟悉Android开发的常用工具和库。这将对提升Android开发技能大有裨益。
【Android源码——掌上几分钟视频应用源码.zip】是一个包含Android应用程序源代码的压缩文件,主要用于学习和研究Android平台上短视频应用的开发。这个源码提供了掌上几分钟视频应用的完整实现,帮助开发者深入理解...
本资源"安卓Android源码——安卓Android快速框架+多线程下载框架的技术"提供了深入理解Android平台下的应用程序开发,特别是涉及到Afinal和Gson这两个关键库的使用。下面我们将详细探讨这些知识点。 一、Android...