应用程序类是在UI线程上运行吗?

11

抱歉,我是个新手,但我在Java的Application类中创建了一个方法,运行一个具有复杂到中等算法的方法是否安全?这会对用户界面产生影响吗?


1
有趣的是我从来没有想过这个。 - Divers
我几乎确定它在UI线程中运行,但初始化过程很有趣。 - Divers
3个回答

10

来自进程和线程 | Android Developers(重点是我的):

当应用程序组件启动且应用程序没有运行任何其他组件时,Android系统会为该应用程序启动一个新的Linux进程,其中只有一个执行线程。默认情况下,同一应用程序的所有组件在同一进程和线程中运行(称为“主”线程)。如果应用程序组件启动并且已经存在该应用程序的进程(因为该应用程序存在另一个组件),则在该进程中启动该组件并使用相同的执行线程。但是,您可以安排应用程序中的不同组件在单独的进程中运行,并且可以为任何进程创建其他线程。

以及:

系统不为每个组件实例创建单独的线程。在同一进程中运行的所有组件均在UI线程中实例化,并且对每个组件的系统调用从该线程分派。因此,响应系统回调的方法(例如onKeyDown()报告用户操作或生命周期回调方法)始终在进程的UI线程中运行。

因此,像Application类中的onCreate方法将在主(UI)线程上调用。

只有很少数的类会异步启动,例如IntentService


4

是的,所有应用程序组件,从活动到广播接收器都在 UI 线程上运行。只有当您需要执行一些长时间获取任务、后台执行或网络获取时,才使用 AsyncTask 或 Intent Service 在单独的线程中进行操作,以免影响您的 UI 屏幕。


就目前而言,我个人会选择Runnables,因为有一些博客表明它比AsyncTask更快。谢谢你的回答。 - david

3

从复杂到中等的算法

如果它很复杂,你应该以异步方式运行它,使用ThreadAsyncTaskIntentService或适合你的任何其他方式,但不要直接在Application/Activity/Fragment/Service的子类或运行在UI线程上。否则会拖慢应用程序的启动速度。


是的,我的大多数函数都有点中等到复杂,在没有进行任何线程时会导致我的用户界面出现延迟。谢谢你的回答。 - david

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接