【问题标题】:Running on UI Thread from a view从视图在 UI 线程上运行
【发布时间】:2011-08-02 04:33:58
【问题描述】:

我有一个自定义视图,它本身包含多个视图。我已经做到了,当单击此容器视图中的一个视图时,它将运行一个“计时器”线程,该线程需要每秒更新一个 TextView,也在容器视图内。当我想每秒更新 TextView 时,就会出现我的问题。显然,这并不像我想象的那么容易。我像这样在我的容器视图中实现了 Runnable,并在单击按钮以启动计时器时执行线程:

public void run() {
        while(runnning) {
            // if one second has passed, update the Textview
        }
}

我得到了典型的 cannot-touch-views-outside-hierarchy 异常,这基本上意味着它没有在 UI 线程上运行。我不想在这里使用post(Runnable),因为我不想一直等到线程结束才更新一秒钟。将它所在的整个 Activity 传递给自己运行 runOnUiThread(Runnable) 对我来说也是不切实际的。那么有人可以告诉我如何去做这件事吗?如果有人需要澄清,请告诉我!

【问题讨论】:

    标签: android multithreading view runnable ui-thread


    【解决方案1】:

    您想使用 Android AsyncTask。它是一个特定于 Android 的结构,仅用于在等待完成时进行这种定期 GUI 更新。

    在 doInBackground 中设置计时器,并在您希望它更新 GUI 时让它调用 publishProgress。然后在 onProgressUpdate 中更新 GUI。 onProgressUpdate 在 GUI 线程上运行,doInBackground 自动在后台线程上运行。

    【讨论】:

    • 谢谢,我用 AsyncTasks 搞定了!
    【解决方案2】:

    传递整个活动是什么意思? 每当您想更新 UI(例如 1 秒后)调用时,您可以通过在此线程内创建一个计时器线程来实现它 runOnUIThread() .

    【讨论】:

    • 让我澄清一下。我在上面描述的是在我创建的名为 Timer 的自定义视图中,它扩展了 View。当您单击 Timer 内的按钮时,我希望 Timer 能够自行运行。您的回答没有帮助,因为视图中不存在 runOnUiThread()。
    猜你喜欢
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2012-07-21
    相关资源
    最近更新 更多