Android(七) Handler、多线程、buddle
来源:互联网 发布:淘宝上怎么买氰化钾 编辑:程序博客网 时间:2024/06/04 20:24
本文内容简介:
讲解Handler的传递消息的作用,以及多线程相关的知识,以及buddle的使用
Handler
Handler的简单描述:
1. Handler这个类就是管理某个线程(也可能是进程)的消息队列,比如让Handler处理主线程的消息队列,这样就可以将一些耗时任务放到其他线程之中,待任务完成之后就往主线程的消息队列中添加一个消息,这样Handler的Callback,即handleMessage就会被调用。但是Handler并不是线程安全的,因此官方文档中建议将Handler作为一个静态内部类。
2. 所以Handler只是处理消息,耗时任务放在其他线程。
3. Handler的使用主要是android中无法在主线程(即UI线程)中访问网络、无法在子线程中访问UI线程元素。一般是在子线程中访问网络,然后使用Handler发送message通知主线程处理UI更新操作
1.Handler简单使用
- 为多线程的一种方法,实际上Handler和main的线程在一个里面。需要参考第3部分的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的消息传递
- 需要复写handleMessage函数
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的另一种消息传递方法
- Bundle是一种特殊的Map键值对为(string, 其他一般的数据类型-不可以是object)
- 设置启动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")); }};
0 0
- Android(七) Handler、多线程、buddle
- android 使用Buddle传递数据
- android looper handler 多线程
- android handler 多线程demo
- android handler 多线程
- Handler与Android多线程
- android handler 多线程demo
- android handler 多线程demo
- Android--多线程之Handler
- Android 多线程通信Handler
- Android--多线程之Handler
- Android--多线程之Handler
- Android--多线程之Handler
- Android--多线程之Handler
- Android--多线程之Handler
- Android--多线程之Handler
- Android 多线程之Handler
- Android--多线程之Handler
- 元素定位
- 使用JDB调试Java程序
- Invalid standard action 错误
- 08-1 UIControl 及其子类 UISegmentedControl 、UISlider
- 系统设计师之路·第三节·一花一世界,一叶一菩提——无处不在的设计思想
- Android(七) Handler、多线程、buddle
- 【Android】AndroidStudio上传代码到SVN及从SVN中检出代码
- 取给定正整数的指定bit位开始的指定长度的数据
- centos6.5 安装 MySQL5.7
- day05 数组 排序
- nginx取资源要用get方式,post会失败
- Spark SQL 官方文档-中文翻译
- ROS学习笔记(三)::RVIZ::wiki::translation::catkin:一:Creating a workspace for catkin
- pythonchallenge(0-9)