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