【问题标题】:Application class does it run on UI thread or?应用程序类是在 UI 线程上运行还是?
【发布时间】:2015-05-22 07:00:06
【问题描述】:

对不起,我是新手,但我在 java 的 Application 类中创建了一个方法,运行具有复杂到中等算法的方法是否安全?它会在 UI 中出现问题吗?

【问题讨论】:

  • 有趣的是我从未想过它
  • 我几乎可以肯定它在 UI 线程中运行,但有趣的是初始化是如何进行的

标签: java android multithreading


【解决方案1】:

来自Processes and Threads | Android Developers(强调我的):

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

还有:

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

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

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

【讨论】:

    【解决方案2】:

    是的,从活动到广播接收器的所有应用程序组件都在 ui 线程上运行,只有当您必须使用异步任务或意图服务在单独的线程中执行一些长提取任务或后台执行或网络提取时,它才会这样做也不会让你的 ui 屏幕变得渣滓。

    【讨论】:

    • 我会(我自己的理解)个人选择 runnables,因为有一些博客比 asynctask 更快。谢谢你的回答
    【解决方案3】:

    复杂到中等算法

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

    【讨论】:

    • 是的,我的大多数功能都有些中等到复杂,当我不做任何线程时,会在我的 ui 中产生延迟。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2016-12-30
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多