`
tansitongba
  • 浏览: 503580 次
文章分类
社区版块
存档分类
最新评论

Android线程解惑

 
阅读更多

一个应用只有一个线程

在默认情况下,更确切的讲一个进程中只有一个线程,这跟其他语言,比如C/C++,Java等是一致。也就是说在Android应用程序里面一个进程只有一个线程,所有组件都运行在一个线程里面!
当应用程序启动时,系统会为其创建一个进程,也会创建一个线程名字叫做main,所有其所属组件的创建,系统事件的处理,系统的回调等一切应用相关的事情都运行在此名叫main的线程中。此线程即为常说的主线程(main thread)。俗称的UI线程(UI thread)也是它,因为只有主线程可以操作UI相关的事情,所以有人把主线程也称作UI线程,但这并不是正确的说法,因为Service所属的线程也可以操作Toast,但是Service并没有UI。为什么非主线程不能操作UI呢?因为对UI操作常常会引发系统的回调,所以如果允许第三线程来操作可能会引发系统回调的紊乱,进而会打乱整个框架的时序!
这里要特别注意的就是同一个进程中的所有组件运行在同一个线程中,Activiy,Service,BoradcastReceiver和ContentProvider都运行在主线程中。

最容易引起误解的就是Service,文档和常识都会认为Service是放在后台用于操作费时运算的,但是实则不然,如果你在Service中做费时操作,同样会引发臭名昭著的ANR(Application Not Responding)。所以如果想把Service当做一个Server,必须在Service用HandlerThread或Thread创建一个Worker线程!

Activity也是一样的,你startActivity()后,开启了一个新的Activity,但它们都运行在同一个线程中,所以你还是不能在原Activity中做费时操作!也即在调用startActivity()开启了一个新的Activity后,或者在onPause(), onStop(), onDestroy()中做费时操作会引发ANR。

对于ContentProvider也是一样的,如果跟其他组件在同一进程内,那么调用ContentResolver的方法会相当于直接调用ContentProvider的方法。如果是在另外一个进程中,虽是通过IPC,但也是同步的,因为IBinder的同步的,也即调用ContentResolver时会把调用者的进程挂起,等待ContentProvider的进程操作结束,再把结果传给调用者进程!所以,如果ContentProvider中有费时操作,或者会同步锁数据库等,也一定要注意ANR的发生!
所以一定要记住:一个进程只有一个线程,所有组件都运行在主线程中。
因此,如果有费时操作,必须要创建Worker线程!

实例

下面有一个小实例,一个应用中有五个组件:2个Activity,一个Service,一个ContentProvider和一个BroadcastReceiver。在每个组件的方法中都有打印所属线程信息,另外对于Activity,Service和ContentProvider如果做费时操作会引发ANR,对于BroadcastReceiver更是如此,这个大家都懂得的!







分享到:
评论

相关推荐

    深入Android线程的相关问题解惑

    在Android开发中,线程管理是一项至关重要的任务,因为它直接影响到应用的性能和用户体验。默认情况下,每一个Android应用都在一个进程中运行,而这个进程只有一个主线程,也被称为UI线程。主线程的主要职责是处理...

    Java解惑.pdf

    Java编程语言是世界上最流行的开发平台之一,广泛应用于企业级应用、移动应用(尤其是Android系统)、大数据处理、云计算等领域。这份“Java解惑.pdf”文档很可能包含了解决Java开发者在编程过程中遇到的常见问题和...

    Java解惑

    Java编程语言自1995年发布以来,一直保持着旺盛的生命力,广泛应用于企业级应用、移动开发(尤其是Android)以及大数据处理等领域。然而,随着技术的深入,开发者们经常会遇到一些令人困惑的问题。"Java解惑"这个...

    JAVA解惑.rar

    Java编程语言是世界上最流行的开发平台之一,广泛应用于企业级应用、移动应用(尤其是Android系统)、Web应用以及云计算等领域。"JAVA解惑.rar"这个压缩包显然包含了一些关于Java编程的问题解答或者教程,可能是针对...

    Android平台多线程下载工具,支持断点续传!.zip

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,...

    java解惑.doc

    Java编程语言是世界上最流行的开发平台之一,广泛应用于企业级应用、移动应用(Android系统)、大数据处理、云计算等领域。本文档“java解惑.doc”旨在帮助Java开发者解决他们在学习和实践过程中遇到的问题,深入...

    java 解惑,很不错。

    6. **多线程**:线程的基本概念,线程同步与通信(synchronized关键字、wait/notify、Thread.join()等),线程池的使用。 7. **IO流**:输入输出流的分类与使用,包括字符流和字节流,以及NIO(非阻塞I/O)的介绍。...

    java解惑

    作为一款面向对象的语言,Java以其跨平台、安全性高、性能稳定等特点,成为开发企业级应用、移动应用(尤其是Android系统)以及大数据处理的重要工具。在学习Java的过程中,开发者往往会遇到各种疑惑和问题。"Java...

    JAVA/VC++/C/SQL面试解惑大全

    面试中可能会涉及的知识点包括:JAVA的基础语法(如类、对象、接口、继承),多线程,异常处理,垃圾回收机制,JAVA集合框架(如ArrayList、LinkedList、HashMap),IO流,以及JAVA面向对象的设计模式等。...

    java课程设计标准教程 java课程设计

    这份Java课程设计标准教程,通过doc格式的文档,不仅详述了上述知识点,还可能包含了实例代码和解惑答疑,以帮助读者更好地理解和掌握Java编程。无论是自学还是课堂教学,都是一份宝贵的参考资料。

    JavaEye论坛热点月报 总第8期

    - **Java线程死锁与内存溢出**:深入讲解了Java多线程环境下可能导致的死锁问题及如何避免,同时讨论了内存管理,特别是如何预防和处理内存溢出。 - **公司项目地图引擎技术解惑**:介绍了地图引擎的实现原理,...

    19-工具框架1

    - **解惑**:配置`dataBinding{enabled = true}`后,Android编译器会自动生成对应的Binding类。 - **与ButterKnife对比**:DataBinding提供了一种更原生的、类型安全的数据绑定方式,而ButterKnife主要处理视图...

    培训:培训项目

    因此,这个培训项目可能涵盖Java的基础语法、面向对象编程、异常处理、集合框架、IO流、多线程、网络编程、数据库连接等关键主题,并且可能还会涉及到高级特性如反射、注解、设计模式等。 【压缩包子文件的文件名称...

    binus2021

    内容可能涵盖Java的基础语法、面向对象编程、异常处理、多线程、集合框架、IO流、网络编程、数据库连接以及高级特性如反射和注解等。 【标签】"Java"明确了这个压缩包的核心内容,即Java编程语言。Java是一种广泛...

Global site tag (gtag.js) - Google Analytics