Android中的Handler-Looper实现

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 年左右它的行为方式。

以上是关于Android中的Handler-Looper实现的主要内容,如果未能解决你的问题,请参考以下文章

Android中的倒计时实现

Android中的缓存机制与实现

Android中的线程实现不起作用

Android中的Apk的加固(加壳)原理解析和实现

Android 中的缓存机制与实现

Android 中的缓存机制与实现