从非UI线程启动Activity是否安全?

23

假设我的活动UI线程在某个时刻生成了一个单独的线程。这个新线程是否可以安全地触发意图(Intent)以启动一个新的活动(activity)呢?

谢谢。

3个回答

12

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

如果想要百分之百确定,可以在你的活动的runOnUiThread()中作为一个Runnable来调用你的startActivity()


5
我查看了startActivity()的源代码,确实在主线程上运行,所以你可以放心从后台调用它。 - Jason Crosby
并非所有的固件/情况都会出现此问题。在调用startActivityForResult后,我遇到了java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()的错误。您需要在UI线程中运行此代码,否则在某些糟糕的实现中可能会导致崩溃。 - Enyby
从后台线程调用startActivity()是不安全的。 - Joel Nieman

9
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);

0
我做了一个实验: - 从非 UI 线程启动活动,在 onCreate() 中放置一个循环,从 1 到 100,其中我打印线程名称 Thread.currentThread() - 在非 UI 线程中启动活动后立即放置相同的循环
输出同时显示它们的名称 Thread[AsyncTask #1,5,main] 和 Thread[main,5,main]。

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