android基础--Handler,Loop,MessageQueue
来源:互联网 发布:淘宝外贸原单店铺推荐 编辑:程序博客网 时间:2024/06/06 09:57
Handler可以声明在主线程可以声明在新开的线程,只不过在新开的线程定义handler要自己创建一个Looper对象,并通过prepare()启动它。在ui线程中系统已经初始化了一个Looper对象。
先看定义在主线程的情况:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Handler handler = new Handler(){ public void handleMessage(Message msg){ if(msg.what==123){ Bundle bundle=msg.getData(); int i=bundle.getInt("i"); Toast.makeText(getApplicationContext(),"handler 测试成功 "+i,Toast.LENGTH_SHORT).show(); } } }; new Timer().schedule(new TimerTask() { @Override public void run() { int i=5; Message message=new Message(); Bundle bundle=new Bundle(); bundle.putInt("i",i); message.setData(bundle); message.what=123; handler.sendMessage(message); } },0,1200);
这里定义了一个Timer来启动一条新线程以周期性的执行任务。
Looper:每个线程只能有一个Looper,它的loop方法负责读取MessageQueue中的消息,读到信息之后就把信息交给发送该消息的handler进行处理。
现在来看在子线程定义handler的情况:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button=(Button)findViewById(R.id.btn); mes msg=new mes("来自主线程"); final Message message=new Message(); message.what=123; Bundle bundle=new Bundle(); bundle.putSerializable("msg", msg); message.setData(bundle); final MyThread myThread=new MyThread(); myThread.start(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myThread.handler.sendMessage(message); } }); } class MyThread extends Thread{ public Handler handler; public void run(){ Looper.prepare(); handler=new Handler(){ public void handleMessage(Message message){ if(message.what==123){ Bundle bundle=message.getData(); mes msg=new mes(); msg=(mes)bundle.getSerializable("msg"); Toast.makeText(MainActivity.this,"测试成功 "+msg.getText(),Toast.LENGTH_SHORT).show(); } } }; Looper.loop(); } }
mes类
public class mes implements Serializable{ String text; public mes() { } public mes(String text) { this.text = text; } public String getText() { return text; } public void setText(String text) { this.text = text; }}
这里值得注意的是如果不设个按钮事件,而是直接将myThread.handler.sendMessage(message);写在myThread.start()后面会报出空指针异常。
0 0
- android基础--Handler,Loop,MessageQueue
- Android Handler (Loop MessageQueue) 解析
- Android Handler、Loop、MessageQueue的工作原理
- Handler、Loop和MessageQueue
- Handler、Loop、MessageQueue
- Android---28---Handler、Loop、MessageQueue的工作原理:
- Handler、Loop、MessageQueue的关系
- Handler, Loop, MessageQueue的工作原理
- Handler、Loop、MessageQueue的工作原理
- Handler、Loop、MessageQueue的工作原理
- Loop、Handler、MessageQueue和Message源码分析
- Handler,Loop,Message,MessageQueue,ThreadLocal关系详解
- Handler、Loop、MessageQueue的工作原理<温故知新>
- Android MessageQueue和Loop分析
- HandlerThread、Loop、MessageQueue、Handler、Message组成的Android的消息处理机制
- Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
- Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
- 第五课:Android中Handler、Loop、MessageQueue的工作原理和使用方法
- 利用predis操作redis方法大全
- linux下php开发自定义扩展库
- 关于创业,感觉这句话说到了点子上
- ViewPager+Fragment实现左右滑动页
- 从下至上按层遍历二叉树
- android基础--Handler,Loop,MessageQueue
- tomcat图形化界面管理及数据源配置
- Notification相关和一些关键点收集
- 交叉验证
- PHP 计算下个月当天日期,解决跨年和2月份的各种问题
- Educational Codeforces Round 1 A. Tricky Sum(简单模拟求和)
- Educational Codeforces Round 1 B. Queries on a String(字符串简单操作)
- 关于jsp页面一些bug问题
- Educational Codeforces Round 1 D. Igor In the Museum(BFS)