【问题标题】:How is CountDownTimer accessing UI inside OnTick method?CountDownTimer 如何在 OnTick 方法中访问 UI?
【发布时间】:2011-06-15 08:01:12
【问题描述】:

CountDownTimer 如何在onTick 方法中访问 UI?

(new CountDownTimer(10000,1000){

    @Override
    public void onFinish() {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTick(long millisUntilFinished) {
        TextView tv = (TextView)findViewById(R.id.tvLCD);
        tv.setText(Long.toString(millisUntilFinished));
    }           
}).start();

【问题讨论】:

  • 你的意思是什么?它是匿名内部类,可以访问活动字段。
  • 我想从 Thread 访问 UI,但我不能,我发现 CountDownTimer 类很容易访问 onTick 方法中的 UI 元素。它正在倒计时(我认为使用线程)并且可以轻松访问 UI。我想知道怎么...
  • 就像@damluar 说的,它是一个匿名的内部类:它可以访问所有的Activity 字段和方法(所以findViewById 有效)。
  • 它的工作方式与 AsyncTask 相同,只有一种方法可以在 UI 线程中执行
  • 它工作正常...你的问题是什么????

标签: android layout countdowntimer


【解决方案1】:

从@Sergey Glotov 给出的答案中的链接( GreCode - Handler ),很明显倒数计时器根本不使用单独的线程。这就是您能够访问所有 UI 元素的原因。我不知道他们为什么使用处理程序。但它不会产生新线程。它在 UI 线程本身上运行。

【讨论】:

  • 文档实际上并没有说明这一点,所以我认为这是一个实现细节并且依赖它是危险的。 AsyncTask 显式调用在 UI 线程上运行的函数,所以如果没有说我会对冲我的赌注,只使用 runOnUiThread()。
【解决方案2】:

您可以通过Activity.runOnUiTread()View.post()View.postDelayed()Handler 从线程访问 UI。 CountDownTimer 为此目的使用Handler (source)。

阅读this article 了解如何使用所有这些方法。

【讨论】:

  • 我看到了你的链接。阅读它们后,我知道倒计时计时器使用处理程序但不会产生新线程。这意味着,倒计时不会发生在单独的线程中。那为什么要使用 HANDLER?处理程序的目的是充当线程和 Ui 线程之间的媒介。
  • 文章链接失效。
  • @Nima 谢谢。修好了。
  • @Ashwin,处理程序的目的不是充当线程和 UI 线程之间的媒介,目的之一是在与当前线程不同的线程上执行代码。 CountDownTimer 不一定使用 ui 线程,请阅读我的答案以获得更好的解释。
【解决方案3】:

CountDownTimer 没有任何机制来访问 onTick 方法中的 UI。 更重要的是,从源代码中,您可以看到它在内部使用了一个在对象创建时获取的处理程序。所以它在创建计时器的线程上运行。

这个问题是不恰当的,在您的情况下,我想您可以访问这些视图,因为您可能将 CountDownTimer 创建为活动上的匿名类。如果你足够幸运,这是在 UI 线程上完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2019-03-15
    • 2018-03-01
    相关资源
    最近更新 更多