我有一个包含两个活动的应用程序。从主活动开始,我使用startActivityForResult()
开始一个辅助活动。次要活动将数据(以Intent
对象的形式)返回给主要活动。在主要活动上,我有一个方法onActivityResult()
来处理从次要活动返回的问题。
在这个onActivityResult()
方法中,我需要更新主活动上的View
(以反映新的数据值)。我没有明确生成任何线程。我的问题是:我可以直接从onActivityResult()
方法中修改视图吗?还是需要在UI队列中放置一个事件来修改视图?更明确地说:我能确定onActivityResult()
方法在UI线程上吗?在这种情况下,我能忘记UI队列吗?
尽管onActivityResult
在Ui线程上,但在onActivityResult
中修改时可能看不到更新的Ui。我怀疑原因是在onResume
处重新绘制Ui元素,这通过在super.onResume()
处调用ActivityTransitionState
的resetViews()
来强制重置Ui元素。
我在简单地更新onActivityResult
中的EditText
时遇到了这个问题。EditText
未更新。
解决方法是将数据保存在onActivityResult
中,并通过在onActivityResult
中设置标志来更新onResume
中的Ui。
-
可以,您可以在
onActivityResult()
中修改视图。在onCreate()
中调用setContentView()
后,只要在UI线程上运行,就可以随时修改Activity
的视图。 -
是的,在UI线程上调用
onActivityResult()
。这适用于所有生命周期方法(onCreate()
、onResume()
等)。
onActivityResult()在UI线程中执行,您可以修改此方法的视图。
当我试图在制作照片后返回的onActivityResult()上创建并显示AlertDialog时,我会收到一个"android.view.WindowLeaked"错误android.view.WindowLeaked:
Activity com…MainActivity泄露了最初添加到此处的window com.android.internal.policy.impl.PhoneWindow$DecorView{37ac7e30 V.E…..R….I,0-1272584}
只要我尝试显示对话框。
因此,我认为假设OnActivityResult()在主线程上运行并不总是可以的。