我正在重新提交这个问题,因为我不认为我的最后一个真的遇到了我遇到的问题。
所以我有一个返回的线程,然后使用处理程序更新UI,如下所示:
public void completeSignIn(final boolean success, final String error) {
Log.d(Constants.LogTag, "Finalising Sign In...");
final Looper mainLooper = Looper.getMainLooper();
final Handler mainHandler = new Handler(mainLooper);
mainHandler.post(new Runnable() {
@Override
public void run() {
if (success) {
TextView tv = (TextView) getActivity().findViewById(R.id.register);
tv.setText("SIGNED IN!!");
} else if (!success) {
}
}
});
}
我遇到的问题是,因为线程可以在完成查询服务器之后的任何时候返回,所以没有gaurantee getActivity()将返回Activity。我发现如果我在线程即将返回时旋转我的设备,可以在活动destroy / create循环之间调用这段代码。我不确定我在这里使用片段是否很重要,但我不认为使用父活动来更新视图有什么害处?
所以我不确定如何强制处理程序等到活动创建 - 这可能,或者你是一个处理这个问题的标准方法吗?我在其他测试过的应用程序中看不到这一点。
更新
我在我的片段中放了一些日志并设法得到以下内容来说明我的问题:
07-09 22:17:15.164 25435-25435 /? D / Kevins_Tag:分离活动......
07-09 22:17:15.234 25435-26702 /? D / Kevins_Tag:登录...
07-09 22:17:15.234 25435-26702 /? E / Kevins_Tag:活动为空
07-09 22:17:15.234 25435-26687 /? D / Kevins_Tag:敲定登录......
07-09 22:17:15.284 25435-25435 /? D / Kevins_Tag:附加活动......
07-09 22:17:15.284 25435-25435 /? D / Kevins_Tag:活动存在
如您所见,该线程在分离和附加之间调用UI ...
答案 0 :(得分:1)
我不确定这是否可以解决您的问题,但我会尝试检查现有活动,然后再做任何事情,例如:
//any code
Activity activity = getActivity();
if(activity != null) {
if (success) {
TextView tv = (TextView) activity.findViewById(R.id.register);
tv.setText("SIGNED IN!!");
} else if (!success) {
}
}
//any code
答案 1 :(得分:1)
正如您在问题中解释的那样,方法completeSignIn()
位于您的一个片段中。 Runnable
包含的completeSignIn()
是片段的内部类,因此,它包含对片段的引用。这就是Runnable
中的代码可以调用片段方法getActivity()
的方式 - 调用是使用"隐藏"片段参考。
您正确地注意到,在配置更改期间,可以在片段与活动分离后调用completeSignIn()
,从而导致空活动引用。你问:
我不确定如何强制处理程序等到活动 已创建
在这种情况下,这是不可能的。但是,即使它是,它也无济于事。 completeSignIn()
引用的片段已死。它被分离并销毁,最终将被垃圾收集。重新创建活动时,不使用旧片段 - 构建新片段,并使用旧片段的已保存状态完成创建生命周期步骤。
在不知道如何管理整个服务器登录状态和显示的情况下,很难建议替代方法。除了在登录完成时更新登录视图外,一种选择是将状态保持在单身人士中。对于视图可能由于无法访问而未更新的配置更改,活动将负责在使用单例状态重新创建活动时更新视图。