Java View.OnTouchListener是否在UI线程以外的其他线程上运行?

Java View.OnTouchListener是否在UI线程以外的其他线程上运行?,java,android,multithreading,ontouchlistener,Java,Android,Multithreading,Ontouchlistener,如果我有一个类对象Square(这不是MainActivity,而是MainActivity创建Square对象)来实现视图。OnTouchListener,那么Square中的onTouch()方法是在UI线程上运行还是在另一个线程上运行 它似乎是在另一个线程上运行的,因为我无法从onTouch()方法中更新UI,而不在我的MainActivity对象上调用runOnUiThread() ==编辑在下面============================= 我按照@pskink的建议记录了

如果我有一个类对象
Square
(这不是
MainActivity
,而是
MainActivity
创建
Square
对象)来实现
视图。OnTouchListener
,那么
Square
中的
onTouch()
方法是在UI线程上运行还是在另一个线程上运行

它似乎是在另一个线程上运行的,因为我无法从
onTouch()
方法中更新UI,而不在我的
MainActivity
对象上调用
runOnUiThread()

==编辑在下面=============================

我按照@pskink的建议记录了
Thread.currentThread().toString()
,并得到以下结果:

MainActivity中的onCreate():线程[main,5,main] 正方形中的onTouch():线程[main,5,main]

因此,现在很清楚,我在
Square
中运行的
onTouch()
方法在UI/主线程上运行

谢谢大家的帮助!:-)

View.OnTouchListener是否在UI线程以外的其他线程上运行


否。它应该在UI线程中调用。请使用下面的代码了解当前线程是否为UI/主线程

if(Looper.myLooper() == Looper.getMainLooper()) {
   // Current Thread is Main Thread.
}
or you can also use this

if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
   // Current Thread is Main Thread.
}
从我的角度来看,它是在UI线程上运行的,如果您仍然有疑问,可以将上述代码放在onTouchListener中并检查它

View.OnTouchListener是否在UI线程上运行

对。100%. 默认情况下,系统将调用UI线程上的所有方法。 但您可以在
onTouch()方法中对工作线程执行操作

Ps,

UI更改必须在
UI线程上执行。考虑调用<代码> RunOniTyths>代码>,同时需要从<代码>工作线程< /代码>中更新UI。您应该考虑使用线程来避免ANR(应用程序没有响应)。一个好的开始是
AsyncTask
,它有自己的方法在一个单独的线程中执行逻辑,并更新
主线程上的UI

“它看起来像是在另一个线程上运行,因为[…]”
,只需
Log.d
线程的值()
在您的
onTouch
方法中,这一切都取决于调用它的线程。一般来说,它可以在任何线程上调用。但是,如果系统以常规方式对触摸做出反应,则系统将在UI线程上调用它。@VladMatvienko如果您调用
View#setOnTouchListener(View.OnTouchListener)
,则
View.OnTouchListener
将始终在主UI中调用thread@pskink,而不是在另一个线程上手动调用,或者任何其他代码在另一个线程上调用它。这就是我在评论中所说的。没有例外:
View.OnTouchListener
将始终在主UI线程上被调用是的,你是对的。我在代码中看到了这一点。它实际上运行在
main线程上
,无论您在哪里设置
OnTouchListener
。但是AIDL过程呢??因为文档中说“从本地进程发出的调用在发出调用的同一个线程中执行。如果这是您的主UI线程,则该线程将继续在AIDL接口中执行。如果是另一个线程,则该线程将在服务中执行您的代码。”查看此链接-我真的不明白如何调用
View#setOnTouchListener
,以便将被称为
AIDL
接口的侦听器我不是指
onTouch()
本身。我的上下文是在
onTouch()中编写代码。您可以在
onTouch()
内的工作线程上执行操作,而
onTouch
将始终在
main线程上调用。对于问题:
View.onTouch侦听器是否在UI线程上运行?
您的答案是:
Yes。几乎100%的例外:-如果您通过AIDL公开接口