【问题标题】:Updating UI Activity in Thread在线程中更新 UI Activity
【发布时间】:2011-10-05 10:34:45
【问题描述】:

这是我的问题。我正在编写一个 android 应用程序,它需要显示它正在运行的活动的时间。因此,我创建了一个从活动中调用的新线程。但是,当我在模拟器中启动应用程序时,似乎从未加载过 Activity。也许你们可以在这里帮助我。以下是相关代码:

public class ActivityStartTracker extends ActivityBasic {
    TimerThread timer;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.start);
        timer = new TimerThread();
    }

    protected void onResume() {
        super.onResume();
        registerReceiver(broadcastReceiver, new IntentFilter(
                ServiceLocator.BROADCAST_ACTION));
        timer.run();
    }

    protected void onPause() {
        super.onPause();
        unregisterReceiver(broadcastReceiver);
        if (timer.isRunning()) {
            timer.interrupt();
        }
    }

    class TimerThread extends Thread {
        boolean isRunning = false;

        public TimerThread() {
        }

        @Override
        public void run() {
            int seconds = 0;
            isRunning = true;
            while (isRunning) {
                try {
                    Log.d(TAG, "Timer is running for : " + seconds);
                    seconds++;
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    isRunning = false;
                }
            }
        }

        public boolean isRunning() {
            return isRunning;
        }
    }
}

就像我说的,这些是相关的代码片段。 问题是,如果我运行它,Activity 将保持黑色 - 我只是得到带有应用程序名称的标题,仅此而已。通过日志记录,我可以确认线程正在运行,但没有显示任何其他内容。

你能帮帮我吗,我对android很陌生。
非常感谢 - 已经提前了。

【问题讨论】:

  • 喂!我没有看到您更改 gui 的代码?我想更新线程中的 gui,你必须使用 runOnUIThread()
  • 是的——在我尝试添加显示计时器的新功能之前,GUI 运行良好——因此我认为我可以删除所有 findView() 和 setText() 方法。我只是想展示问题的核心——所以你们不必阅读所有不必要的代码行。

标签: android multithreading android-activity


【解决方案1】:

调用 timer#run() 就可以做到这一点,在 UI 线程中调用 #run() 方法。你需要通过调用 #start() 来启动你的线程——然后新线程会按照你的期望进行。

进一步:永远不要调用 Thread#start() 两次,它实际上不会重新启动线程,只会使您的应用程序崩溃。如果您打算从 onResume 启动线程,则需要在那里分配一个新线程。

顺便说一句,考虑改用 AsyncTask。

兄弟, 延斯

【讨论】:

  • 我也想到了 AsyncTask,但是它用于显示活动运行的秒数,我无法弄清楚如何让 AsynTask 在 while()-loop 中运行然后将其放入睡一秒钟。顺便说一句...感谢您的快速帮助 - 它有效。
【解决方案2】:

请记住,唯一可以更新 UI 的线程是 UIThread

所以如果你想在另一个线程中修改 UI,你应该使用方法:runOnUIThread()

,但是当你有一个线程会更新 UI 时,最好的方法是使用 AsyncTask ;参考this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 2014-01-14
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多