Android 在UI线程上运行代码的这些方法之间有什么区别?
关于如何在UI线程上运行代码,web上发布了不同的方法。它们都完成了相同的任务,然而,我真的想知道这些方法之间的区别 方法1: 方法2: 方法3:Android 在UI线程上运行代码的这些方法之间有什么区别?,android,android-handler,android-looper,android-thread,android-threading,Android,Android Handler,Android Looper,Android Thread,Android Threading,关于如何在UI线程上运行代码,web上发布了不同的方法。它们都完成了相同的任务,然而,我真的想知道这些方法之间的区别 方法1: 方法2: 方法3: 所有方法的工作原理如下: 方法1循环处理程序(如果存在循环) 如果不是私有的或需要,方法2处理程序可以在所有活动中工作 方法3处理程序只能在当前活动中工作方法1将始终工作 方法2仅在您已经在UI线程上时才起作用-没有Looper参数的新处理程序将创建当前线程的处理程序,如果当前线程上没有Looper,则失败 方法3需要在活动中执行或在活动对象上调用,
所有方法的工作原理如下: 方法1循环处理程序(如果存在循环) 如果不是私有的或需要,方法2处理程序可以在所有活动中工作
方法3处理程序只能在当前活动中工作方法1将始终工作 方法2仅在您已经在UI线程上时才起作用-没有Looper参数的新处理程序将创建当前线程的处理程序,如果当前线程上没有Looper,则失败
方法3需要在活动中执行或在活动对象上调用,因为runOnUiThread是活动的函数。但在引擎盖下,它将与1一样,尽管可能会保留一个处理程序以提高效率,而不是总是使用新的处理程序。在Android中,一个线程可能有一个循环器或消息队列。处理程序用于向线程的MessageQueue发送消息或post Runnable,并且它必须始终与线程的Looper或MessageQueue关联 方法1 当打开一个应用程序时,Android会创建一个名为main thread或UI thread的新线程,该线程带有一个Looper和MessageQueue,用于呈现UI和处理用户的输入事件 上面的代码是创建一个处理程序,并与UI线程的循环器关联,因此runnable将排队到UI线程的MessageQueue,稍后将执行 方法2 创建处理程序并与当前线程的循环器关联,有3种情况: 如果此代码在UI线程上执行,则runnable将排队到UI线程的MessageQueue,并将在以后执行。 如果此代码是在后台线程上执行的,如果此线程具有循环器,则runnable将排队到后台线程的MessageQueue,并将在稍后执行。 如果此代码在后台线程上执行,并且此线程没有循环器,则将引发异常。 方法3
只是一个实用的活动方法,当您想在UI线程上执行一些代码时使用它。此方法背后的逻辑是,如果当前线程是UI线程,则立即执行它,否则使用Handler将消息发布到UI线程的MessageQueue,类似于方法1。完美的详细解释!
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
new Handler().post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
new Handler().post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});