Handler应用总结
先从自己之前遇到的一个问题讲起吧:我想在应用里面实现两件事:点击Button后,1)每隔三秒更换一次桌面。2)每隔三秒在ImageView里面更换一张图片
图片是从资源里面随机得到的。想单纯实现换桌面和换图片是容易的,只要调用setWallpaper(bmp);
和
mImageView.setImageDrawable(getResources().getDrawable(bgs[r]));就可以了,但是要周期改变图片就有点小麻烦了。我们最容易想到的就是开个线程来控制,于是就想用如下代码:
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new Thread() {
public void run() {
while (true) {
int r = rand();
Bitmap bmp = BitmapFactory.decodeResource(
getResources(), bgs[r]);
//mImageView.setImageDrawable(getResources().getDrawable(bgs[r]));
try {
setWallpaper(bmp);
Thread.sleep(3000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
});
大家会注意到:换图片的的方法被注掉了,因为这样用的话,会抛出CalledFromWrongTreadExeption。为什么会有这样的异常呢?这是因为:像ImagerView这样的View之类的东西只能在UI线程里被调用。而我们的应用的UI线程只有一个,就是当前这个Activity的线程。我们自己开的线程都不是UI线程。这就要用到Handler了。android里面对于异步消息的处理,提供了一套Handler的实现方案。Handler有很多适宜的应用和微妙之处,使它在和Thread以及Service等一起使用的时候达到很好的效果。Handler与调用者处于同一线程,如果Handler里面做耗时的动作,调用者线程会阻塞。
一个Handler允许你传递和执行结合了一个线程的消息队列的Message类或Runnable类的对象。每一个Handler的实例被结合于一个单独的线程和一个线程的消息队列。当你创建一个新的Handler时,它被绑定到一个正在创建它的线程的线程/消息队列--从这一点来看,当messages和runnables出了消息队列时,这个Handler将传递这些messages和runnables到那个消息队列并执行它们。
Handler有两个重要的作用:1)安排messages和runnables在将来被作为一些元素来执行。2)把一个将要被执行,并且与你当前的线程不同的action入队。
下面就看看怎么利用Handler解决一开始提到的问题吧,首先在自己开的线程中把消息发出去:
Button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
// Message message = Message.obtain(mHandler,
// EVENT_TIME_TO_CHANGE_IMAGE);
Message message = mHandler.obtainMessage(EVENT_TIME_TO_CHANGE_IMAGE);
mHandler.sendMessage(message);
}
};
timer.schedule(task, 3000L, 3000L);
}
});
被注掉的方法和它下面得到message的方法效果是一样的。然后要在主线程里new一个Handler来接受消息并处理事件:
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case EVENT_TIME_TO_CHANGE_IMAGE:
int r = rand();
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
bgs[r]);
try {
setWallpaper(bmp);//换桌面
changeImg(r); //换图片
} catch (IOException ie) {
ie.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
};
这样,就不会出现CalledFromWrongTreadExeption异常了。[color=blue][/color]
分享到:
相关推荐
Android 高手进阶教程(二)之----Android Launcher 抽屉类 SlidingDrawer 的 使用 最近在研究 Lanucher ,看了源码,发现了 SlidingDrawer 这个类,也就是 所谓的"抽屉"类。它的用法很简单,要包括 handle ,和 content...
这篇“Android提高十八篇之自定义Menu(TabMenu)”的主题聚焦于如何在Android应用中创建和定制化自己的菜单栏和标签页功能。下面我们将深入探讨这个话题,详细讲解相关的知识点。 首先,了解Menu的基本概念。在...
典型的循环包括Update、Render和HandleInput步骤。 6. **Android传感器和事件处理**: 游戏可能利用Android设备的触摸屏输入,通过MotionEvent和View.OnTouchListener来捕捉用户的触摸事件。同时,可能还会使用...
通过对这个项目的深入研究,开发者不仅可以学习到如何使用SlidingDrawer,还能了解到早期Android开发的一些技巧和限制。同时,这也为开发者提供了一个很好的起点,去探索更现代的侧滑菜单实现,比如使用`...
通过研究这些代码,你可以更好地理解MediaRecorder的工作原理,并在实际项目中应用。 总结一下,Android的MediaRecorder类提供了一种强大且灵活的方式,用于在移动设备上录制视频和音频。了解如何正确配置和使用它...
通过研究这个源码,开发者不仅可以掌握`SlidingDrawer`组件的用法,还能了解到触摸事件处理、动画实现以及通知管理等方面的知识。对于想要提升Android UI设计和交互体验的开发者来说,这是一个不容错过的学习案例。
在Android开发中,动画效果是提升用户体验的关键因素之一。"安卓动画效果相关-android抽屉效果.rar"这个资源包主要关注的是Android平台上的抽屉(Drawer)效果,这种效果常见于许多应用的侧滑菜单,例如Google Maps...
《深入解析Android 4.2原生锁屏GlowPadView源码》 在Android开发领域,理解系统原生组件的源码...通过研究其内部机制,开发者不仅可以增强对Android系统的理解,还能在实际项目中运用这些知识,提升应用的用户体验。
开发者可以通过设置`handle`(手柄)和`content`(内容区)来定制抽屉样式,并通过监听器监听抽屉的打开和关闭事件。不过,由于其已被弃用,所以开发者应该避免在新的项目中使用它。 为了实现更现代的抽屉效果,...
在本项目中,我们探讨的是一个使用纯Java编写的2D坦克小游戏的Android应用程序源代码。这个项目展示了如何在Android平台...通过深入研究并理解源码,开发者不仅能提升Android编程技能,还能对游戏开发有更深入的理解。
OpenGL是计算机图形学中的一个标准库,用于在各种操作系统和硬件平台上创建2D和3D图形。在Android系统中,我们可以使用OpenGL ES(Embedded ...通过研究这些文件,你可以看到如何将理论知识应用于实际的Android开发中。
尽管如此,理解SlidingDrawer的工作原理对于历史遗留项目或者对Android UI组件有深入研究的开发者来说仍然是有价值的。 SlidingDrawer的基本结构包含两个主要部分:handle和content。handle是用户可以拖动的部分,...
通过深入研究这个源码,开发者不仅可以学到如何创建一个仿Google Play的侧滑菜单,还能对Android早期的Holo主题有更深入的理解,这对于维护旧版本应用或者了解Android设计演进历程非常有价值。同时,这也是提升...
Android提供了UncaughtExceptionHandler来处理未捕获的异常,开发者可以通过重写其handleException方法,将异常信息记录到日志或者发送到服务器。此外,使用try-catch语句块可以捕获特定的运行时异常。源码中可能...
基于Android平台的移动学习系统的研究涉及到了现代信息技术与教育相结合的新型学习模式,即移动学习(M-learning)。该系统通过Android智能设备,如智能手机和平板电脑,提供了学习、交流和管理学习资源的新方式。...
### Android进程间通信(IPC)机制Binder守护进程之路 #### 一、概述 在上一篇文章中,我们简要介绍了Android系统中的进程间通信(IPC)机制Binder及其整体架构。Binder机制由四大核心组件构成:客户端(Client)、...
在本文中,我们将深入研究Client如何通过`getService`接口获取Server的远程接口,从而能够调用Server提供的服务。 以Android自带的多媒体播放器为例,我们将分析MediaPlayer如何通过`IServiceManager::getService`...
轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考 目前测试图片为mipmap中的图片 没有写从网络加载图片 可自行...
通过研究和借鉴`ui.cpp`中的`touch_handle_input()`方法,开发者可以了解如何在Recovery模式下实现触摸屏控制,从而为用户提供更直观、更友好的操作体验。这涉及到深入理解Android系统底层的工作原理,特别是输入...
为了实现curl高性能,高并发,需要研究如何实现高性能高并发。研究方向有三个。 (1) 长连接。考虑采用长连接的方式去开发。首先研究下长连接和短连接的性能区别。curl内部是通过socket去连接通讯。socket每次连接...