线程返回UI - 活动未创建?

时间:2015-07-09 19:05:02

标签: android

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

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

2 个答案:

答案 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()引用的片段已死。它被分离并销毁,最终将被垃圾收集。重新创建活动时,不使用旧片段 - 构建新片段,并使用旧片段的已保存状态完成创建生命周期步骤。

在不知道如何管理整个服务器登录状态和显示的情况下,很难建议替代方法。除了在登录完成时更新登录视图外,一种选择是将状态保持在单身人士中。对于视图可能由于无法访问而未更新的配置更改,活动将负责在使用单例状态重新创建活动时更新视图。