通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带Looper的,当线程要接收来自主线程的消息是就需要调用Looper.prepare()和Looper.loop()。以下我们将通过一个示例,讲述主线程和线程之间如何发送Message。
01 |
import android.app.Activity; |
02 |
import android.os.Bundle; |
03 |
import android.os.Handler; |
04 |
import android.os.Message; |
05 |
import android.widget.Toast; |
08 |
* 这个类是主线程,它每隔两秒就发送一个Message给线程,线程收到Message后将发送一个Message给主线程,主线程收到Message后会将Message内容Toast出来。 |
09 |
* org.fneg.HandlerTestActivity.java |
10 |
* Create at: 2012-6-4 下午9:39:19 |
12 |
* Email:fengcunhan@gmail.com |
15 |
public class HandlerTestActivity extends Activity { |
16 |
private Handler uiHandler; |
17 |
private ThreadWithLooper thread; |
18 |
private Runnable showRunable; |
20 |
public void onCreate(Bundle savedInstanceState) { |
21 |
super.onCreate(savedInstanceState); |
22 |
setContentView(R.layout.main); |
23 |
uiHandler=new Handler(){ |
25 |
public void handleMessage(Message msg) { |
27 |
case Messages.MSG_HELLO: |
28 |
Toast.makeText(HandlerTestActivity.this, (String)msg.obj, Toast.LENGTH_SHORT).show(); |
34 |
thread=new ThreadWithLooper(uiHandler); |
37 |
showRunable=new Runnable() { |
42 |
thread.getHandler().sendEmptyMessage(Messages.MSG_HELLO); |
43 |
uiHandler.postDelayed(this, 2*1000); |
46 |
uiHandler.post(showRunable); |
51 |
protected void onStop() { |
53 |
uiHandler.removeCallbacks(showRunable); |
01 |
import android.os.Handler; |
02 |
import android.os.Looper; |
03 |
import android.os.Message; |
07 |
* org.fneg.ThreadWithLooper.java |
08 |
* Create at: 2012-6-4 下午4:58:11 |
10 |
* Email:fengcunhan@gmail.com |
13 |
public class ThreadWithLooper extends Thread { |
14 |
private Handler handler; |
16 |
private Handler uiHandler; |
18 |
public ThreadWithLooper(Handler mHandler){ |
19 |
this.uiHandler=mHandler; |
20 |
//初始化Handler,接收到主线程发送过来的Message就回复一个Message给主线程,消息内容是 一个字符串和当前时间 |
21 |
handler =new Handler(){ |
24 |
public void handleMessage(Message msg) { |
26 |
case Messages.MSG_HELLO: |
27 |
Message message=new Message(); |
28 |
message.what=Messages.MSG_HELLO; |
29 |
message.obj="Yes!I get a hello"+System.currentTimeMillis(); |
30 |
uiHandler.sendMessage(message); |
39 |
public Handler getHandler() { |
43 |
public void setHandler(Handler handler) { |
44 |
this.handler = handler; |
03 |
* org.fneg.Messages.java |
04 |
* Create at: 2012-6-4 下午4:51:20 |
06 |
* Email:fengcunhan@gmail.com |
09 |
public class Messages { |
10 |
public static final int MSG_HELLO=0X1; |
- Handler主线程子线程之间的互相通信
Handler主线程子线程之间的互相通信 package com.wyl.dansnote; import android.app.Activity; import android.os.Bundle ...
- Android消息机制之实现两个不同线程之间相互传递数据相互调用
目的:实现两个不同线程之间相互传递数据相互调用方法. 线程一中定义mainHandler 并定义一个方法mainDecode 线程二中定义twoHandler 并定义一个方法twoEncode 实现当 ...
- Android主线程的消息系统(Handler\Looper)
前言: 之前的文章写的都是关于Bitmap和内存的优化技术,这一篇文章给大家谈谈Handler. Handler是Android系统中比较重要的一个知识,在Android多线程面试经常会被问到,在实际 ...
- android 主线程和子线程之间的消息传递
从主线程发送消息到子线程(准确地说应该是非UI线程) package com.zhuozhuo; import android.app.Activity; import android.os.Bun ...
- Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解
MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...
- Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息
MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...
- Android 主线程和子线程通信问题
Android 如今不支持View在子线程中创建及调用其方法.假设要实现子线程内容更新之后.将结果及时反馈到主线程中,该怎样出来呢? 能够在主线程中创建Handler来实现. 这样子线 ...
- Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作
前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行. 比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void load ...
- RxJava开发精要7 – Schedulers-解决Android主线程问题
原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...
随机推荐
- table的样式定义
table的cellpadding和cellpadding我们经常会用如下的方式来清除默认样式: <table cellspacing="0" cellpadding=&qu ...
- 【JSP动态网站】JDBC连接SqlServer 2008数据库
JSP程序需要通过JDBC接口才能访问数据库. 启动MyEclipse,选择“Window”→“Open Perspective”→“MyEclipse Database Explorer”菜单项,打 ...
- python 重要模块
1,使用字典的特殊字符串替换,基于字典的字符串格式化
- javascript第十三课:Json
js中的json就是字典,Dictionary,就是字典的简化创建方式,json的遍历使用for in的方式,进行遍历 遍历复杂json格式 (如果数组里面存储的是键值对的话,字符串最好用双引号) v ...
- react-native 自己搭建热更新服务器
使用到的框架是 react-native-update react-native-update-cli 这个应该执行热更新的时候的终端命令. 通过这个,自己搭建一个热更新的服务器.
- 前端学习——JQuery Ajax使用经验
0.前言 在项目推进过程中常常使用Ajax,通过Jquery提供的函数能够很方便的使用Ajax,可是在实际使用中也遇到一些问题,比如怎样防止浏览器使用缓存,怎样使用同步方式等.通过博文整理总结 ...
- as3 页游中,新手指导中,屏蔽所有交互对象,但除了指定交互对象可用的方法【转http://blog.csdn.net/linjf520/article/details/9450945】
package { import flash.display.InteractiveObject; import flash.display.Stage; import flash.events.Mo ...
- Android 多线程:使用Thread和Handler (从网络上获取图片)
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分 ...
- 模块化利器:RequireJS常用知识
1. 模块化 目前常见的模块化开发方式,全局空间方式是最基本的一种,另外常见的还有遵循AMD规范的开发方式,遵循CMD规范的开发方式,和ECMAScript 6的开发方式.需要说明的是,CMD和ES6 ...
- Backup Exec Inventory 与Catalog的含义(转载)
编录:即catalog,就是让磁带机读取磁带之前所备份过的内容的目录列表,可以让你知道之前做过什么备份,以及备份时间等详细信息. 列清单:inventory,跟编录是不同,inventory是查询磁带 ...