suchen

Heim  >  Fragen und Antworten  >  Hauptteil

为什么Android系统会给程序的主线程自动添加Looper?

如何实现自动添加的?

大家讲道理大家讲道理2772 Tage vor636

Antworte allen(2)Ich werde antworten

  • PHP中文网

    PHP中文网2017-04-17 15:03:49

    Android 在进程的入口函数 ActivityThread.main()中,调用 Looper.prepareMainLooper, 为应用的主线程创建Looper,然后调用Looper.loop()就启动了进程的消息循环,然后就可以处理消息了。

    ActivityThread源码:

    151 public final class ActivityThread {
    
    2202    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    2253            if (activity != null) {
    2259                activity.attach(appContext, this, ..., );
    
    5219    public static void main(String[] args) {
                // 在这儿调用 Looper.prepareMainLooper, 为应用的主线程创建Looper
    5240        Looper.prepareMainLooper();
    5242        ActivityThread thread = new ActivityThread();
    5245        if (sMainThreadHandler == null) {
    5246            sMainThreadHandler = thread.getHandler();
    5247        }
    5254        Looper.loop();
    5257    }
    5258}

    Looper源码:

    52 public final class Looper {
            // Initialize the current thread as a looper, marking it as an application's main looper.
            // The main looper for your application is created by the Android environment,
            // so you should never need to call this function yourself. See also: prepare()        
    87     public static void prepareMainLooper() {
    88         prepare(false);
    89         synchronized (Looper.class) {
    90             if (sMainLooper != null) {
    91                 throw new IllegalStateException("The main Looper has already been prepared.");
    92             }
    93             sMainLooper = myLooper();
    94         }
    95     }

    Activity源码:

    660 public class Activity extends ContextThemeWrapper {
    699     /*package*/ ActivityThread mMainThread;
    
    5922    final void attach(Context context, ActivityThread aThread, ..., ) {
    5944        mMainThread = aThread;

    参考:

    http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/ActivityThread.java
    http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/Activity.java
    Android应用程序进程启动过程的源代码分析 - by 罗升阳
    Android_Message_Handler_消息处理机制总结笔记

    Antwort
    0
  • 迷茫

    迷茫2017-04-17 15:03:49

    @li21 讲的很好,
    顺便跟楼主说下,如何自动实现增加Looper
    你可以使用HandlerThread

    Antwort
    0
  • StornierenAntwort