Android编程中关于单线程模型的理解与分析
本文讲述了Android编程中关于单线程模型的理解与分析。分享给大家供大家参考,具体如下:
当一个Android程序启动时,Android系统会同时启动一个对应的主线程(Main Thread)。
由于这个主线程(Main Thread)主要的任务就是对UI相关的事件进行处理(例如显示文本,处理点击事件,显示图片等),系统对每一个组件的调用都是从主线程中分发出去的,所以又常被称为UI线程。
IMP,Android单线程模型的核心原则就是:只能在UI线程(Main Thread)中对UI进行处理。
为了提高Performance,Android对UI处理的相关method都不是synchronized,所以当你试图用其他线程来对UI进行操作时,会抛出如下异常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
当然,这并非鼓励我们将一切操作都放在UI线程当中进行。
有些十分费时但对UI更新影响很小的操作(如网络操作,数据库操作等),若一起放在UI线程当中去进行的话,会导致UI Performance十分poor,对的,非常非常poor,甚至弹出ANR(Application Not Responding)窗口,这无疑对用户是十分不友好的。
Ps:据我所知,Android SDK在4.0版本之后就不支持在Main Thread中直接进行网络相关操作,除非你厚颜无耻地在主线程中加上如下代码:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() .build());
因此,Android单线程模型的原则总结起来大致有两点:
1.只能在UI线程(Main Thread)中对UI进行处理,不要在UI线程之外访问Android UI toolkit
2.不要用费时的操作阻塞UI线程
关于如何处理好Android程序中的多线程,可以参考Android官方training
希望本文所述对大家Android程序设计有所帮助。
相关文章
学习使用Material Design控件(三)使用CardView实现卡片效果
这篇文章主要为大家介绍了学习使用Material Design控件的详细教程,如何使用CardView实现卡片效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-07-07
Android Activity之间相互调用与传递参数的原理与用法分析
这篇文章主要介绍了Android Activity之间相互调用与传递参数的原理与用法,较为详细的分析了Android组件的构成以及Activity的创建、调用、切换等相关操作技巧,需要的朋友可以参考下2016-08-08
Android UI设计与开发之实现应用程序只启动一次引导界面
这篇文章主要为大家详细介绍了Android UI设计与开发之实现应用程序只启动一次引导界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-08-08
浅析Android中getWidth()和getMeasuredWidth()的区别
这篇文章主要介绍了浅析Android中getWidth()和getMeasuredWidth()的区别 ,getMeasuredWidth()获取的是view原始的大小,getWidth()获取的是这个view最终显示的大小,具体区别介绍大家参考下本文2018-04-04
Android实战打飞机游戏之实现主角以及主角相关元素(3)
这篇文章主要为大家详细介绍了Android实战打飞机游戏之实现主角以及主角相关元素,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-07-07


最新评论