【问题标题】:Handler-Looper implementation in AndroidAndroid中的Handler-Looper实现
【发布时间】:2011-07-16 01:00:12
【问题描述】:
  1. 我有带有处理程序的活动(UI 线程)
  2. 我启动新线程并制作 handler.post(new MyRunnable()) - (new work thread)

Android 文档中提到了 post 方法:“导致 Runnable r 被添加到消息队列中。runnable 将在附加此处理程序的线程上运行。”

处理程序附加到 UI 线程。 android如何在不创建新线程的情况下在同一个UI线程中运行runnable?

是否会使用来自 handler.post() 的 Runnable 创建新线程? 还是只会从 Runnable 子类调用 run() 方法?

【问题讨论】:

    标签: android implementation handler looper


    【解决方案1】:

    这是一个关于如何使用处理程序的粗略伪代码示例 - 我希望它有所帮助:)

    class MyActivity extends Activity {
    
        private Handler mHandler = new Handler();
    
        private Runnable updateUI = new Runnable() {
            public void run() {
                //Do UI changes (or anything that requires UI thread) here
            }
        };
    
        Button doSomeWorkButton = findSomeView();
    
        public void onCreate() {
            doSomeWorkButton.addClickListener(new ClickListener() {
                //Someone just clicked the work button!
                //This is too much work for the UI thread, so we'll start a new thread.
                Thread doSomeWork = new Thread( new Runnable() {
                    public void run() {
                        //Work goes here. Werk, werk.
                        //...
                        //...
                        //Job done! Time to update UI...but I'm not the UI thread! :(
                        //So, let's alert the UI thread:
                        mHandler.post(updateUI);
                        //UI thread will eventually call the run() method of the "updateUI" object.
                    }
                });
                doSomeWork.start();
            });
        }
    }
    

    【讨论】:

    • 所以UI线程只调用“updateUI”对象的run()方法?并且UI线程不会创建新线程并调用start()在新线程中做run()方法代码?
    • 据我了解,这是正确的。 (CommonsWare 似乎在上面说同样的话,而且他说话很有权威。xD)
    • @Cephron :OP 试图说,当您创建可运行对象时,它的 run 方法将由单独的线程运行。那么如何在 UI 线程中运行该任务。因为当你调用runnable.start()时,会创建一个新线程对吗?
    • @Ashwin:我不这么认为......当你创建一个新的 Thread 对象并调用 thread.start() 时,就会创建一个新线程。您通常使用 Runnable 初始化一个新的 Thread 对象,但您也可以使用 Runnable 做其他事情——比如将它们发布到 Handler。
    【解决方案2】:

    处理程序附加到 UI 线程。

    正确。

    android如何在不创建新线程的情况下在同一个UI线程中运行runnable?

    任何线程,包括主应用程序(“UI”)线程,都可以在Handler(或任何View,就此而言)调用post()。

    【讨论】:

    • 是否会使用来自 handler.post() 的 Runnable 创建新线程?那么带有runnable的消息将从队列中取出并启动新线程吗?我不明白“runnable 将在此处理程序所附加的线程上运行”是什么意思。 runnable 如何在不创建新线程的情况下在同一个线程中运行?
    • @androidev Alex:不。每个应用程序只有一个主应用程序(“UI”)线程。 post() 将在该线程上运行您的 Runnable
    • @androidev Alex:我想是的,但老实说,我不完全理解你的问题。
    • @CommonsWare :OP 试图说,当您创建可运行对象时,它的 run 方法将由单独的线程运行。那么如何在 UI 线程中运行该任务。因为当你调用runnable.start()时,会创建一个新线程对吗?
    • @Ashwin:“OP 试图说,当你创建一个可运行对象时,它的 run 方法将由一个单独的线程运行。” ——这是不正确的。 Runnable可以在单独的线程中运行;它不会自动在单独的线程中运行。 “因为当你调用 runnable.start() 时,会创建一个新线程,对吧?” - 不。这是标准的 Java,过去 15 年左右它的行为方式。
    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多