Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在UI线程上运行代码的这些方法之间有什么区别?_Android_Android Handler_Android Looper_Android Thread_Android Threading - Fatal编程技术网

Android 在UI线程上运行代码的这些方法之间有什么区别?

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需要在活动中执行或在活动对象上调用,

关于如何在UI线程上运行代码,web上发布了不同的方法。它们都完成了相同的任务,然而,我真的想知道这些方法之间的区别

方法1:

方法2:

方法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
     }
});