代码之家  ›  专栏  ›  技术社区  ›  Tord Larsen smaznet

为什么在主循环线程中运行处理程序

  •  1
  • Tord Larsen smaznet  · 技术社区  · 7 年前

    Handler 可用于与主机进行通信 Looper

    但是我经常看到下面的例子中运行 处理者 在主线程中。为什么这是一个很好的想法,它觉得没有必要,除非有一个像这样的延迟 postDelayed(new Runnable()...

    对此有任何解释都很好

    public class TaleDemoActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_demo);
    
            new Handler().post(new Runnable() {
                @Override
                public void run() {
                    new Handler().post(new Runnable() {
                        @Override
                        public void run() {
                            new Tale("Hello runnables!").tell();
                        }
                    });
                    new Handler().post(new Runnable() {
                        @Override
                        public void run() {
                            new Tale("Hello runnables!").at().tell();
                        }
                    });
                }
            });
    
            new Handler().post(new TestRunnable());
            new Handler().post(new TestStaticRunnable());
    
            new Handler().post(new TestAbstractRunnable() {
                @Override
                public void run() {
                    new Tale("Hello abstract runnable!").tell();
                }
            });
            new Handler().post(new TestInterfaceRunnable() {
                @Override
                public void run() {
                    new Tale("Hello test interface runnable!").tell();
                }
            });
    
            new Tale().at().tell();
        }
    
        class TestRunnable implements Runnable {
            @Override
            public void run() {
                new Tale("Hello testRunnable!").tell();
            }
        }
    
        static class TestStaticRunnable implements Runnable {
            @Override
            public void run() {
                new Tale("Hello testStaticRunnable!").tell();
            }
        }
    
        abstract class TestAbstractRunnable implements Runnable {
    
        }
    
        interface TestInterfaceRunnable extends Runnable {
    
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   lelloman    7 年前

    处理程序不仅仅用于与 主要的 活套。

    Looper 是一个在消息队列上循环并分派消息的类,每个实例使用一个 Thread .

    A. HandlerThread 线 这也有一个问题 活套 附属于它。

    “主要” 您的应用程序的 手摇线 .

    当您实例化 Handler 如果构造函数为空,则 处理者 将附加到 活套 线 在其中创建实例。例如,如果您创建一个 线 在里面 onCreate Activity ,然后 处理者 线 因为生命周期回调是在那里执行的。

    当你打电话的时候 post(Runnable) 这个 Runnable 将在线程上运行 处理者 附于。所以,如果你创建一个 处理者 在您的一个生命周期回调中 那么不管是哪一个 线 你发布 可运行 从开始,它将始终在主服务器上执行

    这是最常见的用法,也是您的代码所做的,但它不是唯一的用法。例如,您可以实例化一个 手摇线 ,然后从 活动 生命周期回调,您可以发布 可运行 这将执行非常长的操作,并且不会阻塞您的UI,因为它将在不同的平台上执行 线 .

    另一种用法 邮政(可运行) (有时是一个针对奇怪UI bug的通用修复程序)就是从主线程调用它,目的是将执行延迟到整个方法执行完毕之后。

    fun onCreate(savedInstanceState: Bundle?) {
        Handler().post {
            // code here is executed after `onCreate` has returned
        }
        // code here is executed before the one posted on the Handler
    }