我正在重新提交这个问题,因为我认为我的最后一个并没有真正遇到我遇到的问题。
因此,我有一个返回的线程,然后使用处理程序来更新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) {
}
}
});
}
我遇到的问题是,因为线程在查询完服务器后可能随时返回,所以不保证getActivity()将返回Activity。我发现如果在线程即将返回时旋转设备,则可以在活动破坏/创建周期之间调用此代码。我不确定在这里使用片段是否重要,但是我认为使用父活动更新视图不会有任何危害吗?
所以我不确定如何迫使处理程序等待直到创建活动-这是否可能,或者这是处理此问题的标准方法吗?由于我在我测试过的其他应用中看不到这一点。
更新
我在片段中放入了一些日志,并设法获得以下内容来说明我的问题:
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。
最佳答案
我不确定这是否可以解决您的问题,但是我要尝试的一件事是在执行任何操作之前检查现有活动,例如:
//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