Handler的post(Runnable)
2016-06-30 22:42
330 查看
首先看一段在子线程中更新UI的操作
主要查看Handler.post()方法
第一:生成Message对象
第二:将Runnable对象放入到msg的callback属性中,并把msg放入MessageQueue消息队列中!
Looper.loop()方法:
(主线程)从消息队列中取出Runnable对象,及Message对象中的callback属性
可以去[]http://blog.csdn.net/buttonxin/article/details/51793781]查看loop()方法
有点等同于iOS中的O-C中的block(不懂百度,我也不懂…) block语句块允许开发者 将一段代码当成一个变量传来传去!!
所以用Handler.post()来充当该机制
Handler handler = new Handler(); //这是Button的点击事件 public void onClick(View v) { //开启子线程 new Thread(new Runnable() { @Override public void run() { String str= null;//这里必须要写上 = null !!初始化 try { Thread.sleep(3000); str = "网路请求得到的数据"; } catch (InterruptedException e) { e.printStackTrace(); } // 这里也必须为final final String finalStr = str; handler.post(new Runnable() { @Override public void run() { //在这里将得到的数据直接更新到UI中 textView.setText(finalStr); } }); } }).start(); }
主要查看Handler.post()方法
第一:生成Message对象
第二:将Runnable对象放入到msg的callback属性中,并把msg放入MessageQueue消息队列中!
//Handler类中 public final boolean post(Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); } // 1.首先查看 getPostMessage(Runnable r)方法: 返回msg对象 private static Message getPostMessage(Runnable r) { Message m = Message.obtain();//得到Msg对象 m.callback = r; //将r对象赋值给msg的callback属性----msg的callback就是Runnable对象 return m; } //再来查看sendMessageDelayed(getPostMessage(r), 0); //其实就等同于sendMessageDelayed(msg, 0); // 2. 该方法下面一系列的操作就是将msg存入到消息队列中 public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); } ...........
Looper.loop()方法:
(主线程)从消息队列中取出Runnable对象,及Message对象中的callback属性
可以去[]http://blog.csdn.net/buttonxin/article/details/51793781]查看loop()方法
public static void loop() { //loop()方法中调用该方法 msg.target.dispatchMessage(msg); } //Handler类中的dispatchMessage()方法 public void dispatchMessage(Message msg) { //这里就是原因:Runnable对象不为空 if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } } //执行handleCallback()方法:里面直接执行了Runnable对象的run方法!而不是生成Thread对象并将r放入去执行start()方法!!!这样是不会另开线程的!!!,只能在原有的线程中执行run()方法!!! private static void handleCallback(Message message) { message.callback.run(); }
有点等同于iOS中的O-C中的block(不懂百度,我也不懂…) block语句块允许开发者 将一段代码当成一个变量传来传去!!
所以用Handler.post()来充当该机制
相关文章推荐
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- 详解Android中Handler的实现原理
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- C#多线程处理多个队列数据的方法
- C#实现线程安全的简易日志记录方法
- C#中线程同步对象的方法分析
- ASP.NET线程相关配置
- 浅析linux环境下一个进程最多能有多少个线程
- 再谈JavaScript线程
- C#实现终止正在执行的线程