【问题标题】:Is it safe to launch an activity from a non-ui thread?从非 ui 线程启动活动是否安全?
【发布时间】:2020-01-07 21:03:26
【问题描述】:

假设我的活动 ui-thread 在某个时候产生了一个单独的线程。新线程触发 Intent 以启动新活动是否安全?

谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    我可能是错的,但我认为startActivity() 在内部在 UI 线程中执行。所以是的,它应该是安全的。

    如果您想 100% 确定,请在活动的 runOnUiThread() 中以 Runnable 的形式调用您的 startActivity()

    【讨论】:

    • 我检查了startActivity() 的源代码,是的,它确实在主线程上运行,因此您可以安全地从后台调用它。
    • 并非在所有固件/情况下。我在拨打startActivityForResult 后收到java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()。你需要在 UI 线程中运行它,或者在一些糟糕的实现中你可能会遇到一些崩溃。
    • 从后台线程调用 startActivity() 是不安全的。
    【解决方案2】:

    startActivityForResult() 的前几行(所有startActivity() 变体都使用)表明没关系:

    public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
        if (mParent == null) {
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
    

    【讨论】:

      【解决方案3】:

      我做了一个实验: - 从非 ui 线程开始活动并在 onCreate() 中放置一个从 1 到 100 的循环,我正在打印线程名称 Thread.currentThread() - 在非 ui 线程中的活动开始后立即放置相同的循环

      输出同时显示它们的名称 Thread[AsyncTask #1,5,main] 和 Thread[main,5,main]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多