Android Kotlin调用recreate()函数报错:主线程调用要求异常
关于Activity.recreate()必须在主线程调用的原因解析
Android的UI操作有严格的线程规则:所有和UI相关的操作必须在主线程(UI线程)执行,因为Android的UI工具包不是线程安全的,多线程直接操作UI会导致界面状态紊乱、崩溃等不可控问题,系统会直接抛出异常来阻止这种不安全行为。
recreate()的本质是销毁并重建Activity:这个过程会触发Activity的一系列生命周期回调(比如
onDestroy()、onCreate()),这些回调本身就运行在主线程;同时重建Activity必然涉及布局加载、控件初始化等UI操作,所以系统强制要求recreate()必须在主线程调用。非主线程调用会触发异常:如果你在子线程、后台任务线程这类非主线程环境调用recreate(),就违反了上述规则,系统会抛出
java.lang.IllegalStateException: Must be called from main thread来提示你操作不符合要求。runOnUiThread的解决逻辑:
runOnUiThread { recreate() }会把recreate()的调用逻辑提交到主线程的消息队列,等待主线程空闲时执行,这样就保证了操作在主线程完成,自然就解决了异常问题。
内容的提问来源于stack exchange,提问作者Swaghaug
相关产品推荐
相关产品推荐

