我正在重新提交这个问题,因为我认为我的最后一个并没有真正遇到我遇到的问题。

因此,我有一个返回的线程,然后使用处理程序来更新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

07-24 19:35