【问题标题】:Android: On resuming Activity, unable to post Runnable on Activity's ViewAndroid:在恢复 Activity 时,无法在 Activity 的视图上发布 Runnable
【发布时间】:2014-03-08 06:38:17
【问题描述】:

我有一个Activity 和一个TextView,每次后台线程调用Activity 上的方法时,我都会设置TextView 的标签和颜色。在我离开 Activity 并重新输入之前,它可以正常工作。在这种情况下,TextView 不会更新,因为发布用于在 UI 线程上执行的Runnable 不会被调用。也许我需要在onResume() 中实现一些东西,但我不知道那会是什么。

下面是在创建Activity 时分配TextView 的方式:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_manage_nameserver);
        statusView = (TextView) findViewById(R.id.statusNameserverButton);
        ...
}

这是后台线程调用的方法,它会更新TextView

public void running(boolean running) {
        final int color;
        final String text;
        if (running) {
            color = Color.GREEN;
            text = "Running";
        } else {
            color = Color.RED;
            text = "Stopped";
        }
        statusView.post(new Runnable() {

            @Override
            public void run() {
                statusView.setTextColor(color);
                statusView.setText(text);
            }

        });
}

在调试器中,我看到当我重新输入Activity 后调用running() 时,传递给statusView.post()Runnable 永远不会被调用。在调试器中检查statusView 对象属性显示成功和失败情况之间没有区别。我不知道恢复 Activity 后有什么不同会导致 Runnable 不被调用。我尝试重新分配onResume() 中的TextView 对象,使用在onCreate() 中分配它的相同代码,但这没有帮助。

【问题讨论】:

  • 先查看resume后的Activity是否和原来的Activity是一样的,原来的Activity可能已经被Android销毁了。另外,检查statusView.post(...) 是否返回true。
  • 感谢凯,这使我能够解决问题。请发表您的评论作为答案,以便我接受并明确解决方案。

标签: android textview android-activity resume ui-thread


【解决方案1】:

首先查看resume后的Activity是否和原来的Activity是一样的,原来的Activity可能已经被Android销毁了。另外,检查statusView.post(...) 是否返回true。

【讨论】:

  • 每次我导航到 Activity 时都会重新创建它。用状态更新Activity的类是单例的,我只在上面注册了原来创建的Activity。由于单例类保留了对它的引用,因此该 Activity 可能没有被垃圾收集,正在被通知;我认为它不再有 UI 上下文。我通过在每次调用 onCreate() 时使用单例注册 Activity 来修复它。当注册一个新的 Activity 时,单例会释放 TimerTask,它保持对前一个 Activity 实例的引用。
  • @MidnightJava 使用此方法,您将始终同时持有同一 Activity 的 2 个实例,至少在短时间内,这是不可取的。快速解决方法是将 Activity 的引用存储为 WeakReference:private WeakReference<Activity> mainRef = new WeakReference<Activity>(mainActivity);,并在每次您想使用引用时执行此操作:Activity mainActivity = mainRef.get(); if (mainActivity != null) {...}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多