您现在的位置是:主页 > Web前端技术 > Web前端技术

如何进行Handler、Looper与MessageQueue源码分析移动开发

IDCBT2022-01-13服务器技术人已围观

简介本篇文章为大家展示了如何进行Handler、Looper与MessageQueue源码分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 在Android中可以通过

本篇文章为大家展示了如何进行Handler、Looper与MessageQueue源码分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

在Android中可以通过Handler来更新主线程中UI的变化,更新UI只能在主线程中进行更新,而为了让其他线程也能控制UI的变化,Android提供了一种机制Handler、Looper与MessageQueue一同协作来达到其他线程更新UI的目的。

一般我们会在主线程中通过如下方法定义一个Handler

private Handler mHandler = new Handler() {         @Override         public void handleMessage(Message msg) {             tv.setText("mHandler change UI");             super.handleMessage(msg);         }     };

一般都见不到Looper与MessageQueue的,那么它们都是在哪里调用与如何协作的呢?在主线程不会显式的调用Looper而是会在ActivityThread.main方法中默认调用。

public static void main(String[] args) {          Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");         SamplingProfilerIntegration.start();           // CloseGuard defaults to true and can be quite spammy.  We         // disable it here, but selectively enable it later (via         // StrictMode) on debug builds, but using DropBox, not logs.         CloseGuard.setEnabled(false);           Environment.initForCurrentUser();           // Set the reporter for event logging in libcore         EventLogger.setReporter(new EventLoggingReporter());           // Make sure TrustedCertificateStore looks in the right place for CA certificates         final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());          TrustedCertificateStore.setDefaultUserDirectory(configDir);           Process.setArgV0("<pre-initialized>");           Looper.prepareMainLooper();//创建Looper           ActivityThread thread = new ActivityThread();         thread.attach(false);           if (sMainThreadHandler == null) {             sMainThreadHandler = thread.getHandler();         }           if (false) {             Looper.myLooper().setMessageLogging(new                     LogPrinter(Log.DEBUG, "ActivityThread"));         }           // End of event ActivityThreadMain.          Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);         Looper.loop();//开启Looper循环           throw new RuntimeException("Main thread loop unexpectedly exited");     }

标签:

很赞哦! ()

本栏推荐