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 多线程 数据传递 handle 源代码 可以通过handle更新ui,提高客户体验
java 手写实现 Android Handle 机制,http://blog.csdn.net/qq_18983205/article/details/79232128 对应代码
android demo,实现主线程handle,工作子线程threadHandle的处理.
android demo,主线程handle,工作线程handle,主线程handle的post Runnable的具体使用方法。
android handler and thread in program
Android Handle Thread.docx
这个是个简单使用handle传递数据的Demo,里面用到了bundle去传值。有需要的可以下载
主要介绍了android中Handle类的用法,以实例形式较为详细的分析了基于Handle类线程执行的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
关于android 上的多线程的部分的一些介绍
主要介绍了android的handle实现多线程和异步处理的示例,大家参考使用吧
知识共享-android之slidingdrawer的应用(雷惊风).
android demo,test印_handle_message_obtainMessage,消息处理和函数名和行号的打
android中Handler类的使用,代码说明请参见以下链接: http://blog.csdn.net/ymlxku/article/details/8489572
Asynchronous Http Client for Android An asynchronous, callback-based Http client for Android built on top of Apache's HttpClient ...Make asynchronous HTTP requests, handle responses in anonymous call
简单明了的PPT,通俗易懂的代码,容易掌握,
了解Andorid中线程之间通信Handler原理。 每一个线程拥有一个Looper,每一个Looper拥有一个MessageQueue
自己学习安卓的时候的学习笔记,非常详细奥,有源码。
FastTextView FastTextView is faster than Android TextView. FastTextView use StaticLayout to render Spanned String, so it support most features of Android TextView. ...4.Correct Ellipsis handle with Im
Android 高手进阶教程(二)之----Android Launcher 抽屉类 SlidingDrawer 的 使用 最近在研究 Lanucher ,看了源码,发现了 SlidingDrawer 这个类,也就是 所谓的"抽屉"类。它的用法很简单,要包括 handle ,和 content...
android demo,使用Handler的postDelay,Runnable run实现延时3秒的splash。