UI线程中调用Handler.post与直接执行方法的区别
来源:互联网 发布:homebrew mysql 启动 编辑:程序博客网 时间:2024/04/28 06:34
有时可以看到在activity/fragment的普通方法中使用Handler.post去更新界面的写法。
常见的Handler.post主要是子线程通知ui线程更新界面,类似handler.sendMessage。
ui线程去Handler.post,既然本身就在ui线程,为何还要Handler.post?我的第一反应就是优化执行顺序。
Looper从MessageQueue取消息交给Handler执行,既然时Queue,自然是先进先出。
Handler执行Message,虽然也在ui线程,但优先级应该是低于普通方法的。
写个简单的例子验证一下:
在ui中打印3个log,用Handler().post输出3个log。
public class MainActivity extends Activity {private final String TAG = "zql";@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Handler().post(new Runnable() { @Override public void run() { //输出log Log.d(TAG, "handler 1"); } }); //输出log Log.d(TAG, "activity 1"); new Handler().post(new Runnable() { @Override public void run() { //输出log Log.d(TAG, "handler 2"); } }); //输出log Log.d(TAG, "activity 2"); new Handler().post(new Runnable() { @Override public void run() { //输出log Log.d(TAG, "handler 3"); } }); //输出log Log.d(TAG, "activity 3");}}
运行结果:
activity 1
activity 2
activity 3
handler 1
handler 2
handler 3
结论:
Handler.post的执行优先级低于普通方法,而且会先执行MessageQueue中先加入的消息。
至于Handler.post和Handler.sendMessage的区别,傻瓜理解点理解为没有区别:
Handler.post传递的是一段代码(一个Runnable对象,里面包含一段需要在ui线程运行的代码)。
Handler.sendMessage传递的是一段数据(发送一个Message到MessageQueue中,里面包含一些数据)。
查看api就可以得知。以android6.0(API-23)为例,Handler.post本质上调用的还是sendMessageDelayed。
Handler类324行
public final boolean post(Runnable r){ return sendMessageDelayed(getPostMessage(r), 0);}
ps.
Handler.sendMessage 和 Handler.post 的执行优先级不分先后,谁先放入队列谁先执行。
- UI线程中调用Handler.post与直接执行方法的区别
- 用Handler的post()方法来传递线程中的代码段到主线程中执行
- Handler中sendMessage与post的区别
- Handler post()等在子线程中更新主线程的UI的方法使用小汇
- Handler的post方法创建的线程和UI线程有什么关系?
- handler.post与UI
- Handler中post方法的调用流程和使用场景
- Handler中post方法的调用流程和使用场景
- Android开发中更新UI时runOnUIthread(Runnable)与Handler.post(Runnable)的区别及如何选择
- 委托的调用方法与执行线程
- handler中send和post方法的区别
- handler.post()方法的执行时机
- handler.post 与线程
- Android子线程中直接回到UI线程执行
- 在Handler的post方法调用Toast
- handler中post与sendmessage区别
- 调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
- Android 解决Handler post运行在UI线程的问题
- 151012总结
- 第四周 项目二 建立单链表算法库
- 第七周---建立顺序环形队列算法库
- 第四周项目4建设双链表算法库
- UITableView全面解析
- UI线程中调用Handler.post与直接执行方法的区别
- Android Studio在创建/导入项目的时候,一直处于building “XXX”gradle project info的解决办法
- 第6周项目3-括号的匹配
- 一个界面中使用两个tableView
- 一夜八次受不了,偶要做回程序猿
- 第6周 项目2 - 建立链栈算法库
- 第三周——【项目4 - 顺序表应用】
- 第4周项目6--多项式求和
- Android MediaScanner:(四)MediaScanner之scanSingleFile