`
mmdev
  • 浏览: 12917456 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Handler: Service中使用Toast

 
阅读更多

关于 android 的线程模型,建议阅读http://blog.csdn.net/androidbluetooth/article/details/6547166,这只是一个建议,你看不看这篇博客都不会影响阅读本篇博客。

Handler 的使用在 android App 开发中用的颇多,它的作用也很大,使用 Handler 一般也会使用到多线程,相信大家对 Handler 不会陌生,在这篇博客中,重点说一下 android 组件之一 Service 与 TaskTimer 结合 Handler 使用,共享之!


*****************************************

**************************************************************************************************************************

*****************************************


阅读这篇博客,需要你知道的知识:


<1> 知道在 Activity 中如何启动、停止 Service 以及 Service 的生命周期。


<2> 使用过 TimerTask 的Api,不过这个不难,如果之前没有接触过现在拿出几分钟学习一下吧!


<3> Handler 基本用法,推荐博客:http://blog.csdn.net/androidbluetooth/article/details/6384641


<4> Looper 基本用法,推荐下载:http://download.csdn.net/detail/AndroidBluetooth/3650576好好看看,肯定对你有用!


好嘞,开始说这篇博客的内容。

界面很简单,就是两个Button,启动之后,效果如下:




Activity 代码:


上述代码就是给两个 Button 设置监听器,启动和停止服务。

然后,在 Service 中 开启一个线程,并在该线程中 Toast 一下!代码如下:


点击界面的“启动服务”,打印信息:

从打印信息可以看出,Service 与 Activity 在同一个线程程(main线程)。

如果你复制我的代码实际运行一下,你会发现子线程中的 Toast 根本没有起作用,并且程序会崩溃,显示异常如下:




这下应该明白,在子线程直接 Toast 是错误的!根据提示信息,我们需要调用 Looper.prepare(),根据 Looper 的 Api 说明,我们还应该调用 Looper.loop(),那麽我们修改一下代码,将 new Thread中的代码修改如下:

该部分完整示例代码下载:http://download.csdn.net/detail/AndroidBluetooth/3653420


ok,这次一切正常。关于 Looper 作用在 http://download.csdn.net/detail/AndroidBluetooth/3650576中说的很明白,这里不再赘述!


接着看看在Service中如何使用 TimerTask 以及 Toast。Activity 的代码不变,修改 Service 代码:


启动服务之后,启动 TimerTask,在 TimerTask 中每隔5秒中 Toast 一下,在终止服务的时候取消 Timer。

打印信息如下:

可以看出,TimerTask开启一个线程(名称为myservice,线程id是8),按照原来的想法一样,每隔五秒 TimerTask 的run() 方法会执行一次,直到 “停止服务”,但是 Toast 并没有起作用。看来我们需要修改代码。

当然,可以像上面那样使用 Looper 的两个静态方法prepare()、loop(),可以保证Toast 完美运行,但是肯定还有其它办法,仔细看来,呵呵!

修改 Service 代码,这次主要使用 Handler:

运行程序,一切ok!我们还是分析一下打印信息吧!

我们使用 Handler 的 post(Runnable r) 方法,在 run 方法中 Toast,根据 Timer 的定时每隔5秒就会 Toast 一下。


该部分完整代码示例,下载地址:http://download.csdn.net/detail/AndroidBluetooth/3653469


这里还需要提醒大家一句:在子线程中我们不可以直接 new Handler(),但是在 TimerTask 的 run() 方法中直接 new Handler() 是没有问题的。TimerTask 的确开启一个子线程,但是为什么在这里可以直接创建 Handler 对象呢?


如果,你有兴趣可以继续:

学习 android 的 Looper 源码以及 TimerTask 设计理念。


多说一句:在 Service 中不可以显示对话框,如果想通过 Service 来显示对话框需要使用 Handler 通知 Activity 来显示对话框。

在 Activity 子线程中显示对话框,可以这样做:

或者使用 Handler,呵呵!

好嘞,这篇博客只是借助 Service 来说明在子线程中如何使用TimerTask、Toast,在Activity 中类似,说到这里吧!








分享到:
评论

相关推荐

    android service thread toast handler

    Demo android组件Service与Toast 第二个版本

    Android实例代码

    3.5、Handler消息传递机制: 第4章、深入理解Activity 4.1、建立、配置和使用Activity: 4.2、Activity的回调机制: 4.3、Activity的生命周期: 第5章、使用Intent和IntentFilter进行通信 5.1、Intent对象详解...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    3.5、Handler消息传递机制: 第4章、深入理解Activity 4.1、建立、配置和使用Activity: 4.2、Activity的回调机制: 4.3、Activity的生命周期: 第5章、使用Intent和IntentFilter进行通信 5.1、Intent对象详解...

    疯狂Android讲义源码

     12.3.1 在Android应用中使用  OpenGL ES 454  12.3.2 绘制平面上的多边形 457  12.3.3 旋转 463  12.4 绘制3D图形 465  12.4.1 构建3D图形 465  12.4.2 应用纹理贴图 469  12.5 本章小结 475  第13章 ...

    疯狂Android讲义.part2

    12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 ...

    疯狂Android讲义.part1

    12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 ...

    Android开发艺术探索

    13.1 使用Crash Handler来获取应用的crash信息 / 449 13.2 使用multidex来解决方法数越界 / 455 13.3 Android的动态加载技术 / 463 13.4 反编译初步 / 469 13.4.1 使用dex2jar和jd—gui反编译apk / 470 ...

    android开发艺术探索高清完整版PDF

    / 392 11.2.1 Async Task / 392 11.2.2 Async Task的工作原理 / 395 11.2.3 Handler Thread / 402 11.2.4 Intent Service / 403 11.3 Android中的线程池 / 406 11.3.1 Thread Pool Executor / 407 11.3.2 ...

    Android开发案例驱动教程 配套代码

    8.4.3 Handler 169 8.4.4 Looper和HandlerThread 172 本章小结 178 第9章 Activity和Intent 179 9.1 Activity 179 9.1.1 创建Activity 179 9.1.2 Activity生命周期 180 9.2 Intent 183 9.2.1 显式Intent 184...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    8.3.3 Toast的Window创建过程 311 第9章 四大组件的工作过程 316 9.1 四大组件的运行状态 316 9.2 Activity的工作过程 318 9.3 Service的工作过程 336 9.3.1 Service的启动过程 336 9.3.2 Service的绑定过程 ...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    4.3 给耶诞老人的信息——Toast对象的使用 4.4 我同意条款——CheckBox的isChecked属性 4.5 消费券采购列表——多选项CheckBox的应用 4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    4.3 给耶诞老人的信息——Toast对象的使用 4.4 我同意条款——CheckBox的isChecked属性 4.5 消费券采购列表——多选项CheckBox的应用 4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    4.3 给耶诞老人的信息——Toast对象的使用 4.4 我同意条款——CheckBox的isChecked属性 4.5 消费券采购列表——多选项CheckBox的应用 4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——...

    Android开发应用实战详解源代码

    2.2.3 service介绍 2.2.4 broadcastintentreceiver 2.2.5 contentprovider 2.3 android应用项目文件组成 2.3.1 androidmanifest.xml文件 2.3.2 src目录 2.3.3 常量的定义文件 2.4 程序生命周期 2.4.1 android周期 ...

    QQ聊天机器人

    Toast.makeText(this, "您还没有填写信息呢...", Toast.LENGTH_SHORT).show(); return; } ChatMessage to = new ChatMessage(ChatMessage.Type.OUTPUT, msg); to.setDate(new Date()); mDatas.add(to...

Global site tag (gtag.js) - Google Analytics