为什么我们使用Handler?为什么我们不在Runnable对象中调用接口元素?

时间:2015-09-22 06:47:51

标签: android android-handler

每当执行此代码时,应用程序崩溃,但是当使用处理程序时,应用程序按预期工作。

 Runnable r = new Runnable() {
        @Override
        public void run() {

            long futuretime = System.currentTimeMillis()+10000;

            while(System.currentTimeMillis()<futuretime){
                synchronized (this){

                    try {
                        wait(futuretime - System.currentTimeMillis());
                    } catch (Exception e) {}
                }
            }
   //this code needs to be inside a Handler ??
           TextView time = (TextView)findViewById(R.id.timedisplay);
        time.setText("Changed Man!!");
   //this code needs to be inside a Handler ??
        }

    };

    Thread thread = new Thread(r);
    thread.start();

}

4 个答案:

答案 0 :(得分:0)

处理UI的代码应该在UI(主)线程上运行。

您(可能)在UI线程上创建一个处理程序,因此通过它发送的所有消息也将在该线程上运行。

答案 1 :(得分:0)

Runnable用于后台进程(后台线程),textview在你的UI线程中,因此后台线程无法与前台线程通信,因此它会给你错误并崩溃你的应用程序。你也可以使用runOnUiThread 。示例

subroutine fortran_calculation_(x,error_code)

implicit none

! * include "error_string" as argument *
real*8  :: x
integer :: error_code


! ... some code ...


if ( ... ) then
  ! * write "error_string" *
  error_code = 1
  return
end if


return 
end subroutine

答案 2 :(得分:0)

您的应用崩溃的原因是您从非UI线程修改了View 如果您使用属于UI-thread 的处理程序执行此操作,则按预期工作。

更新
如果您需要运行Runnable来修改UI,您可以选择:
1)yourActivity。runOnUiThread(Runnable r)
2)yourHandlerOnUIThread。post(Runnable r)
3)yourView。post(Runnable r)

答案 3 :(得分:0)

这里所有答案都提到使用处理程序在Android中使用UI线程。但是,让我添加更多内容 如果您已经 Android文档/教程,您就会知道

  

当应用程序组件启动且应用程序没有时   在运行任何其他组件时,Android系统启动一个新的Linux   具有单个执行线程的应用程序的进程。通过   默认情况下,同一应用程序的所有组件都在相同的位置运行   进程和线程(称为“主”线程或uiThread)。

了解更多信息 refer

现在来看你提到的例子; 您使用Runnable创建了另一个线程...因此可能存在您需要其他线程的场景,然后只需Android应用程序中的mainThread
如果你擅长 JAVA线程概念那么你就会知道如何进行线程间的沟通以及如何进行沟通refer

所以回到问题在android中我们有mainThread 或uiThread所谓的它拥有我们的ui 即视图组件。 这些组件是mainThread专用的,因此其他线程无法访问它 ...这在前面的答案中已经提到过了。
这是 Handler进入图片你做的地方无需担心您的消息将如何从一个线程传递到另一个线程

处理程序

  

Handler有两个主要用途:(1)安排消息和   runnables将在未来的某个点上执行; (2)至   将要执行的操作排入与您的线程不同的线程上执行   发布或发送给处理程序时,您可以允许   消息队列准备好后立即处理的项目,   或者在处理之前指定延迟或者指定它的绝对时间   被处理。后两者允许你实现超时,滴答,   和其他基于时间的行为。

有关详细信息,请参阅docs AND 有关handler and UI thread

的更多信息