【发布时间】:2020-01-07 21:03:26
【问题描述】:
假设我的活动 ui-thread 在某个时候产生了一个单独的线程。新线程触发 Intent 以启动新活动是否安全?
谢谢
【问题讨论】:
标签: android
假设我的活动 ui-thread 在某个时候产生了一个单独的线程。新线程触发 Intent 以启动新活动是否安全?
谢谢
【问题讨论】:
标签: android
我可能是错的,但我认为startActivity() 在内部在 UI 线程中执行。所以是的,它应该是安全的。
如果您想 100% 确定,请在活动的 runOnUiThread() 中以 Runnable 的形式调用您的 startActivity()。
【讨论】:
startActivity() 的源代码,是的,它确实在主线程上运行,因此您可以安全地从后台调用它。
startActivityForResult 后收到java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()。你需要在 UI 线程中运行它,或者在一些糟糕的实现中你可能会遇到一些崩溃。
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);
【讨论】:
我做了一个实验: - 从非 ui 线程开始活动并在 onCreate() 中放置一个从 1 到 100 的循环,我正在打印线程名称 Thread.currentThread() - 在非 ui 线程中的活动开始后立即放置相同的循环
输出同时显示它们的名称 Thread[AsyncTask #1,5,main] 和 Thread[main,5,main]
【讨论】: