Android(七) Handler、多线程、buddle
2015-12-18 20:16
387 查看
本文内容简介: 讲解Handler的传递消息的作用,以及多线程相关的知识,以及buddle的使用 |
Handler |
1. Handler这个类就是管理某个线程(也可能是进程)的消息队列,比如让Handler处理主线程的消息队列,这样就可以将一些耗时任务放到其他线程之中,待任务完成之后就往主线程的消息队列中添加一个消息,这样Handler的Callback,即handleMessage就会被调用。但是Handler并不是线程安全的,因此官方文档中建议将Handler作为一个静态内部类。
2. 所以Handler只是处理消息,耗时任务放在其他线程。
3. Handler的使用主要是android中无法在主线程(即UI线程)中访问网络、无法在子线程中访问UI线程元素。一般是在子线程中访问网络,然后使用Handler发送message通知主线程处理UI更新操作
1.Handler简单使用 |
步骤:
创建Handler对象
创建Runnable
复写runnable中的run,可以加入postdelay
使用handler.post(runnable)或者handler.removeCallbacks(runnable)**
Handler handler = new Handler(); //初始化handler Runnable runnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("this is runable!"); handler.postDelayed(runnable, 3000); //推迟3000ms再将runnable加入队列 } };
加入和移除Thread
handler.post(runnable); //加入到队列中 handler.removeCallbacks(runnable); //从队列中移除runnable
run运行结束则线程死亡
Thread.currentThread().getId()用于得到当前线程的ID
2.Handler的消息传递 |
Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); System.out.println(msg.arg1); } };
Runnable runnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub /*得到消息对象*/ Message msg = handler.obtainMessage(); msg.arg1 = 10; /*发送消息到消息队列中,会在handler的处理函数中接收到*/ handler.sendMessage(msg); System.out.println("this is runable!"); handler.postDelayed(runnable, 3000); } };
3.真正多线程 |
Thread thread = new Thread(runnable); thread.start();
4.Handler的另一种消息传递方法 |
设置启动handlerThread,然后初始化MyHandler对象,最后得到msg并且发送消息
HandlerThread handlerThread = new HandlerThread("demo thread"); handlerThread.start(); //必须要运行,不然下面getlooper得到的为空 MyHandler handler = new MyHandler(handlerThread.getLooper()); Message msg = handler.obtainMessage(); //获得msg Bundle bundle = new Bundle(); bundle.putInt("age", 20); msg.setData(bundle); //设置数据 msg.sendToTarget(); //发送给获得msg的handler
复写handler
class MyHandler extends Handler { MyHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); Bundle bundle = msg.getData(); System.out.println(" id:"+Thread.currentThread().getId() + " age: " + bundle.getInt("age")); } };
相关文章推荐
- 《android studio 1》认识Activity组件
- Android Studio 集成JPUSH推送
- Service后台播放音乐
- IPC——android进程间通信
- SD卡读写实例
- Android 开源项目分类汇总
- Android中px与dip,sp与dip等的转换工具类
- 【Android开发—电商系列】(二):仿淘宝商品属性标签页
- android expandablelistview使用小结
- android创建数据库及adb查看数据库
- ANDROID学习记录(1)--FragmentTabHost 和Fragment的切换。
- android service总结
- Android:LinearLayout布局中Layout_weight的深刻理解
- AndroidClipSquare安卓实现方形头像裁剪
- android edittext 点击两次才弹出输入法的解决方法之一
- View的滑动冲突解决-android开发艺术探索笔记
- android里Toast的用法
- android 获取屏幕大小和屏幕截图
- Android开发环境的搭建之(二)Android Studio的安装
- Android 快速开发系列 打造万能的ListView GridView 适配器