Androids Handler.post,到底发生了什么

Androids Handler.post,到底发生了什么,android,handler,runnable,Android,Handler,Runnable,几天以来,我一直试图弄清楚如果我在中执行代码会发生什么 void function(){ //somePreExecutionCode new Handler().post(new Runnable(){ @Override public void run(){ //someCode } }); } 它似乎没有阻塞UI,因此在某些代码完成之前,调用函数()的按钮不会停留在单击位置。 但是,如果somePreExecutionCode启动pr

几天以来,我一直试图弄清楚如果我在中执行代码会发生什么

void function(){

  //somePreExecutionCode
  new Handler().post(new Runnable(){
    @Override 
    public void run(){
       //someCode
    }
  });
}
它似乎没有阻塞UI,因此在某些代码完成之前,调用函数()的按钮不会停留在单击位置。 但是,如果somePreExecutionCode启动progressBar,则progressBar将在someCode完成的同一时刻显示。 我知道,有异步任务,但还有其他可能性吗

它们之间有什么区别

new Handler().post 

根据:

Runnable将在用户界面线程上运行

根据:

Runnable将在该处理程序所连接的线程上运行

因此,在处理程序的情况下,您可以在任何想要的线程中创建它,它是一种锚点,将执行您在创建它的线程中提供的Runnable


在View.post中,您将始终在uI线程中执行Runnable。

简单地说,存在循环线程,例如uI线程。这样的线程有自己的线程,它为线程运行一个消息循环

这种线程通常有一个线程,它处理其
循环器的消息-覆盖
public void handleMessage(Message msg)
或执行一个
Runnable
,该消息被发布到循环器的消息队列中

当您在UI线程的上下文中创建
处理程序时(就像您在代码中所做的那样),它会与UI线程的循环器相关联,因此您的
\\someCode
会在UI线程上运行

我想,在您的用例中,
newhandler().post(Runnable)
View:post(Runnable)
基本相同,因为它们都向UI线程消息队列添加了一个
Runnable

但它们不一样

  • View:post(Runnable)
    将向UI线程循环器的消息队列添加一个
    Runnable
  • Handler:post(Runnable)
    将把
    Runnable
    添加到与其关联的线程循环器的消息队列中

我的解释非常直观,所以如果我错了,请纠正我。

创建Android应用程序时,系统会创建一个主执行线程。该线程称为UI线程,所有与UI相关的操作都发生在该线程上,以避免同步问题

将在此线程上创建一个实例,该线程具有数据结构。循环器将处于无限循环中,等待读取发布在上的/实例。要将Message7/添加到MessageQueue,请使用

创建处理程序实例时,它将与当前执行线程和在该特定线程上创建的循环器实例相关联

因此,当您通过处理程序发布消息时,该消息将添加到MessageQueue,Looper将以FIFO顺序读取该消息并将其发送到目标

new Handler().post()和View.post有点不同

  • 当您通过View.post发布消息时,可以保证消息将发布在UI线程的MessageQueue上,因为它在内部使用在UI线程上创建的处理程序实例
  • 如果您在UI线程上创建处理程序实例并在任何线程上使用它发布消息,消息将被发布到UI线程的MessageQueue
  • 如果在非UI线程上创建处理程序实例并使用它发布消息,它们将被发布到非UI线程的MessageQueue上

我还想补充一点,必须在创建
处理程序之前调用
Looper.prepare()
,在处理程序初始化之后调用
Looper.loop()
,将
Looper
与这样的线程相关联。我经常使用处理程序,但我从未使用过Looper。。。你什么时候必须使用活套?编辑:算了,我刚看到你的答案。不错。很好的解释。
View.post