欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程中关于单线程模型的理解与分析

程序员文章站 2023-11-28 21:44:22
本文讲述了android编程中关于单线程模型的理解与分析。分享给大家供大家参考,具体如下: 当一个android程序启动时,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程序设计有所帮助。