Android攻城狮 Handler与子线程
Handler和线程是相关联的。再次强调:不可以在主线程中做耗时操作,就比如示例里面主线程中的 handlerMessage(),不能执行耗时操作。创建一个与自定义线程相关的Handler的代码: class MyThread extends Thread{public Handler handler;@Overridepublic void run() {Looper.prepare(); // 创建Looper,默认情况是根据当前线程去拿到Looperhandler = new Handler(){ // 与子线程相关的Handler@Overridepublic void handleMessage(Message msg) {System.out.printf("currentThread:"+Thread.currentThread()); // 打印当前线程的id}};Looper.loop(); // 调用该方法实现对消息的循环处理} } 要在线程中创建一个 Handler,需要先创建 Looper ,创建的方法很简单:Looper.prepare(); 之后就可以创建 Handler 了。在创建 Handler 之后别忘了调用 Looper.loop(); 这样才能实现对消息的循环处理。摘自评论区: 推荐博客一篇:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
主线程和子线程之间的交互的实现 本例的思路: 1. 在主线程中创建两个Handler对象 handler 和 handler2(图中是threadHandler),并直接初始化 handler,而handler2 不初始化。 2. 使用 HandlerThread 创建一个子线程 thread ,并启动 thread 。 3. 初始化 handler2(使用 thread 的 getLooper()作为参数),这样一来handler2就是子线程的 Handler 对象。 4. 重写 handler 和 handler2 的 handleMessage()方法,在里面创建Message对象,并使用对方的sendMessageDelayed(message,1000);方法发送消息。 5. 定义一个Button,定义点击事件,由点击事件触发如上交互的操作。如上操作中,第4点是核心,也就是两个 Handler 各自重写 handleMessage(),方法里面却是使用对方的 sendMessage() 方法。这样就实现了主线程和子线程的相互发送信息。 -------------- 摘自评论区,亲测有效: 取消发送,经测试,需要将UIhandler 和 threadhandler中的message的what 设置为1,取消的时候要同时removeMessage(1);
1 public class FourActivity extends Activity implements OnClickListener { 2 private Button button1, button2; 3 // 创建主线程的 Handler 4 private Handler handler = new Handler() { 5 public void handleMessage(android.os.Message msg) { 6 Message message = new Message(); 7 System.out.println("----main handler"); 8 // 向子线程发送消息 9 threadHandler.sendMessageDelayed(message, 1000); 10 }; 11 }; 12 13 private Handler threadHandler; 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 // TODO Auto-generated method stub 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.four); 20 button1 = (Button) findViewById(R.id.button1); 21 button2 = (Button) findViewById(R.id.button2); 22 button1.setOnClickListener(this); 23 button2.setOnClickListener(this); 24 HandlerThread thread = new HandlerThread("HandlerThread"); 25 thread.start(); 26 // 创建子线程的Handler 27 threadHandler = new Handler(thread.getLooper()) { 28 @Override 29 public void handleMessage(Message msg) { 30 // TODO Auto-generated method stub 31 Message message = new Message(); 32 System.out.println("----thread handler"); 33 // 向主线程发送消息 34 handler.sendMessageDelayed(message, 1000); 35 } 36 }; 37 } 38 39 @Override 40 public void onClick(View v) { 41 // TODO Auto-generated method stub 42 switch (v.getId()) { 43 case R.id.button1: 44 handler.sendEmptyMessage(1); 45 46 break; 47 case R.id.button2: 48 handler.removeMessages(1); 49 break; 50 } 51 } 52 }
转载于:https://www.cnblogs.com/my334420/p/6758675.html
Android攻城狮 Handler与子线程相关推荐
- Android攻城狮Handler简介
Handler是什么? Handler是Android提供的一套用来更新UI的机制,也是一套消息处理机制,可以通过它发送消息,也可以通过它处理消息. 所有Activity生命周期回调的方法(例如onC ...
- 写给即将/正在找工作的Android攻城狮
写给即将/正在找工作的Android攻城狮 版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 这段时间从北上广深杭不断传来一两个月找不到工作的消息,我一 ...
- Android攻城狮组件篇—BroadcastReceiver
组件篇-BroadcastReceiver 1. Boastcast(广播)是一种广泛运用的在应用程序之间传输信息的机制. 2. BroadcastReceiver(广播接受者)是对发送出来的广播进行 ...
- 写给即将正在找工作的Android攻城狮,算法太TM重要了
一.认识鸿蒙 鸿蒙 微内核是基于微内核的全场景分布式OS,可按需扩展,实现更广泛的系统安全,主要用于物联网,特点是低时延,甚至可到毫秒级乃至亚毫秒级. 鸿蒙OS实现模块化耦合,对应不同设备可弹性部署, ...
- Android攻城狮ListView
适配器: 数据适配器:把复杂的数据填充在指定的视图界面上ArrayAdapter 数组适配器 用于绑定格式单一的数据 数据源:可以是集合或数组 SimpleAdapter 简单适配器:用于绑定格式复杂 ...
- Android攻城狮GestureDetector和GestureOverlayView
手势识别 可以通过以下两种方式实现: 1. 使用GestureDetector 2. 使用GestureOverlayView(属于线程的控件)手势交互过程(原理): 1. 触屏一刹那,触发 Moti ...
- Android攻城狮ViewFlipper
使用ViewFlipper实现屏幕切换动画效果. ViewFlipper和ViewPager一样,都是Android自带的一个多页面管理控件,不同的是ViewPager是手动切换页面,而ViewFli ...
- Android攻城狮OptionsMenu
Android的菜单一共有三种: OptionsMenu 选择菜单 ContextMenu 上下文菜单 SubMenu 子菜单创建选项菜单: 在 Activity 里面重写 onCreateOptio ...
- Android攻城狮四大组件之Service
组件篇--Service 当Android系统内存不足的时候,会杀死优先级别较低的Activity,而基本上Service的优先级要高于Activity,所以程序中如果含有 Service,那么该程序 ...
最新文章
- Oracle隐含参数:_allow_resetlogs_corruption
- Session对象的生命周期
- 用类氢轨道计算交换积分和Li原子2S谱项能级
- 24、SQL注入是什么,如何避免SQL注入?
- $\mathfrak {reputation}$
- 自定义JSP中的Taglib标签之四自定义标签中的Function函数
- 零基础Unreal Engine 4(UE4)图文笔记之粒子系统
- 有关JAVA中不同方法对String连接性能的总结
- 求三角形面积(C++)
- 模糊PID控制算法 之 C语言实现
- IntelliJ IDEA设置代码字体大小
- plsql如何显示表结构图_plsql导出导入 表结构、表数据、存储过程等
- 「Mac小技巧」教你如何解决WiFi的国家地区代码冲突
- 正确解决:关于Lattic Diamond软件注册不成功(license问题)
- 圆内接等边三角形的画法_如何画出圆的内接正三角形
- java自动回复_java实现自动回复聊天机器人
- 网站打开速度标准及测试
- python每个if条件后面都要使用冒号_Python基础:条件控制if
- 第五日 高手篇:信用证全攻略
- 当年腾讯为什么从QQ转移扶植到微信,如今微信已撑起腾讯半壁江山
热门文章
- css第四课:id选择器及通配选择器
- 毒你没商量!DOC病毒原理完全解析(转)
- 阿里巴巴-1688-退款退货明细下载(导出)
- Win10磁盘管理器:轻松和安全地调整Win10的分区大小
- 中国好生意 经典论述:哈林是来主持的,刘欢是来开家长会的,那英是来唠嗑的,杨坤是来做宣传的,而......
- 修改hosts文件在本地调试微信JS-SDK
- 登录显示服务器端校验不通过,SMTP服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.7.57 SMTP;...
- C++Primer 第9章 顺序容器
- 三种方式让 Android WebView 支持文件下载
- 部落冲突-建筑大师基地军队建筑介绍(兵营、建筑大师训练营、星空实验室、战争机器)