Handler.post()
2015-08-16 01:27
375 查看
handler.post()方法存在的价值在于
从网络中获取数据在Worker Thread中执行
而后修改ui 在主线程中执行
实现通讯 需要在主线程中生成一个Handler对象
在Worker Thread中使用sendMessage(msg)方法将msg发送到消息队列中
然后在主线程中通过handler.handleMessage(msg)来修改ui
通过handler.post(Runnable r)的机制 就可以直接在Worker Thread中编写线程体
而实际上是在主线程中执行 较上述另一种方法更方便
handler属于主线程 主线程会自动生成Looper对象
Handler handler = new Handler()将Handler Looper MessageQueue绑定
以下是post源码
getPostMessage(r)方法 通过调用Message.obtain()生成并返回新的Message对象msg
并将新生成的msg的callback属性赋值为Runnable runnable
sendMessageDelayed()通过内部多次调用不同方法
将msg加入消息队列MessageQueue queue = mQueue(属于主线程 且已与handler绑定)
同时msg.target = handler
综上 handler.post(runnable)将callback值为runnable的msg 加入与handler绑定的MessageQueue
与handler绑定属于主线程的Looper就会通过loop()方法 处理加入消息队列的msg
loop()方法会调用 msg.target.dispatchMessage(msg);
以下是handler.dispatchMessage(msg)的源码
可以看出因为msg.callback = r 不为空
所以调用handleCallback(msg)
以下是HandleCallback(msg)的源码
可以看出 直接执行runnable.run()对于线程体直接执行 则不会新开线程
所以runnable对象直接在主线程中执行
从网络中获取数据在Worker Thread中执行
而后修改ui 在主线程中执行
实现通讯 需要在主线程中生成一个Handler对象
在Worker Thread中使用sendMessage(msg)方法将msg发送到消息队列中
然后在主线程中通过handler.handleMessage(msg)来修改ui
通过handler.post(Runnable r)的机制 就可以直接在Worker Thread中编写线程体
而实际上是在主线程中执行 较上述另一种方法更方便
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/buttonId" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="button"/> </RelativeLayout>
private Handler handler= new Handler(); private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.buttonId); ButtonListener buttonListener = new ButtonListener(); button.setOnClickListener(buttonListener); } class ButtonListener implements View.OnClickListener { @Override public void onClick(View v) { PostThread postThread = new PostThread(); postThread.start(); } } class PostThread extends Thread{ @Override public void run(){ Runnable runnable = new Runnable() { @Override public void run() { System.out.println("当前线程名字为" + Thread.currentThread().getName()); } }; handler.post(runnable); } }
handler属于主线程 主线程会自动生成Looper对象
Handler handler = new Handler()将Handler Looper MessageQueue绑定
以下是post源码
public final boolean post(Runnable r){ return sendMessageDelayed(getPostMessage(r), 0); }
getPostMessage(r)方法 通过调用Message.obtain()生成并返回新的Message对象msg
并将新生成的msg的callback属性赋值为Runnable runnable
sendMessageDelayed()通过内部多次调用不同方法
将msg加入消息队列MessageQueue queue = mQueue(属于主线程 且已与handler绑定)
同时msg.target = handler
综上 handler.post(runnable)将callback值为runnable的msg 加入与handler绑定的MessageQueue
与handler绑定属于主线程的Looper就会通过loop()方法 处理加入消息队列的msg
loop()方法会调用 msg.target.dispatchMessage(msg);
以下是handler.dispatchMessage(msg)的源码
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
可以看出因为msg.callback = r 不为空
所以调用handleCallback(msg)
以下是HandleCallback(msg)的源码
private static void handleCallback(Message message) { message.callback.run(); }
可以看出 直接执行runnable.run()对于线程体直接执行 则不会新开线程
所以runnable对象直接在主线程中执行
相关文章推荐
- 让你不再畏惧线性代数的5个小知识
- Java 杭电ACM Train Problem I 1022
- mysql 自连接查询数据
- 黑马程序员---冒泡排序和选择排序的理解
- 判断素数ISprime
- ZOJ3558 How Many Sets III(公式题)
- gem install mongo
- 接口的使用
- BZOJ 题目2049: [Sdoi2008]Cave 洞穴勘测(link cut tree)
- 旋转链表
- Unity Shader 学习笔记 (五) 积雪效果Shader
- 计算几何题目分类
- Codeforces Round #316 (Div. 2) E. Pig and Palindromes DP
- 修改完文件,想直接切换分支,怎么办???
- 第八篇:关于释放内存(原创+转载长贴)
- ACM ICPC 2013-2014. NEERC. Eastern Subregional Contest
- Objective-C 三大特征
- 又拍云——图像处理师(GraphicsMagick、ImageMagick、FFmpeg)
- iGriamceV8使用教程
- 全新的Unity移动游戏优化解决方案