hander
来源:互联网 发布:互联网 学什么知乎 编辑:程序博客网 时间:2024/05/16 09:20
Hander提供一个异步的消息处理机制
在Activity中执行下载等复杂操作不应该放在Activity中执行,应该用Hander操作
Handler其实并不会启动新的线程,而是直接调用run方法
使用HandlerThread对象,实现使用Looper处理消息队列的功能
一、基本用法
1.创建一个Handler对象
Handler handler = new Handler();
2.调用Handler的post方法,将要执行的的线程对象添加到队列中
handler.post(updataThread);
在run方法内部,执行post或者postDelayed方法
Runnable updataThread = new Runnable(){@Overridepublic void run(){System.out.println("Hello World");//在run方法内部,执行post或者postDelayed方法handler.postDelayed(updataThread, 3000);}}
二.Handler实现进度条的移动
Handler对象中有两个队列,一个是线程队列,另一个是消息队列1.单击Button显示进度条,加载进程队列
startButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { bar.setVisibility(View.VISIBLE); updateBarHandler.post(updateThread); } });
2.写Handler类,重写Message队列
//Handler类,重写Message队列 Handler updateBarHandler = new Handler(){ @Override public void handleMessage(Message msg) { bar.setProgress(msg.arg1); updateBarHandler.post(updateThread); }
handleMessage是用来接收消息队列的数据
msg.arg1是msg的成员变量,用它来传递数据会省内存重新添加进程队列,循环
3.写Runnable类,重写run方法
//线程类,匿名类 Runnable updateThread = new Runnable(){ int i = 0; @Override public void run() { System.out.println("Being Thread"); i = i + 10; //得到消息对象 Message msg = updateBarHandler.obtainMessage(); msg.arg1 = i ;//用arg1传递消息节省内存 try{ Thread.sleep(1000); }catch(InterruptedException e){ e.printStackTrace(); } updateBarHandler.sendMessage(msg);//加入消息队列 if( i == 100 ){ updateBarHandler.removeCallbacks(updateThread); } } };
线程类中获得Handler中的Message对象,给它赋值之后添加到消息队列即可
三、HandlerThread起新线程收发消息
1.首先起一个HandlerThread线程,再获得Message对象
HandlerThread handlerThread = new HandlerThread("handler_thread");handlerThread.start();MyHandler myHandler = new MyHandler(handlerThread.getLooper());Message msg = myHandler.obtainMessage();//获得Message对象
2.发送Message队列
Bundle b = new Bundle();//容器b.putInt("age", 20);b.putString("name", Jhon);msg.setData(b);msg.sendToTarget();//发送数据Bundle是一个Map类型的容器
3.接受消息
class MyHandler extends Handler{public MyHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg){Bundle b = msg.getData();int age = b.getInt("age");String name = b.getString("name");System.out.println("age is" + age + "name is" + name);}}一定要重写带Looper参数的构造方法
0 0
- Hander
- HANDER
- hander
- Hander
- hander
- Hander妙用
- android hander
- hander机制
- Excel hander
- Hello every high hander
- Android Hander and Message
- Hander.ashx.cs
- Android Hander 通信
- android hander timer
- 安卓中的hander
- android hander总结
- Hander looper messageQueue
- Hander , HandlerThread 用法
- 2017年【计算机视觉&机器学习&人工智能】领域重要会议 汇总 (持续更新)
- serialVersionUID作用
- 面向对象基础
- pod install时遇到“[!] Attempt to read non existent folder '/Users/xxx' ”该如何解决。
- 解决DrawerLayout与RecyclerView冲突
- hander
- lua脚本语言学习笔记(一)---LUA变量和循环语法学习
- Swift面向协议编程(附代码)
- linux IO方式操作gpio
- shell 文件批量拷贝
- android material design中Toolbar 在项目中的基本使用
- 2017功虎创学院招生季已启动,你准备好了吗?
- hdu1428记忆化搜索加最短路
- Android attr属性的定义/读取/出错/使用