android学习(2) 多线程的理解

android学习(2) 多线程的理解,第1张

概述多线程 *** 作UI的运行原理:UI线程:首先启动app时,系统会自动启动一个UI线程,然后此线程会创建一个Looper(注:Looper构造函数会实例化一个MessageQueue的消息队列存在变量mQu

多线程 *** 作UI的运行原理:

UI线程:首先启动app时,系统会自动启动一个UI线程,然后此线程会创建一个Looper(注:Looper构造函数会实例化一个MessageQueue的消息队列存在变量mQueue中),并通过调用loop方法来运行一个无限循环的for,此for里面通过MessageQueue.next()方法不间断的检索消息队列中的Message(如果消息队列为空,将阻塞等待),获取到Message后,则执行message.target(此字段存储的Handler类的实例)的dispatchMessage(Message msg)方法,然后执行recycle()方法回收Message对象(系统维护一个Message对象池,貌似为50个)。

 

Handler:如果是子线程有结果需要反馈给UI线程,则Handler需要在UI线程中如实例化,反之则在子线程中实例化Handler。因为Handler默认实例化时使用的Looper为当前线程的Looper

Handler部分代码截取:

public Handler(Callback callback,boolean async) {        if (FIND_POTENTIAL_LEAKS) {            final Class<? extends Handler> klass = getClass();            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&                    (klass.getModifIErs() & ModifIEr.STATIC) == 0) {                Log.w(TAG,"The following Handler class should be static or leaks might occur: " +                    klass.getCanonicalname());            }        }        mLooper = Looper.myLooper();//此处就是设置获取当前线程的Looper存储到mLooper变量中        if (mLooper == null) {            throw new RuntimeException(                "Can't create handler insIDe thread that has not called Looper.prepare()");        }        mQueue = mLooper.mQueue;        mCallback = callback;        mAsynchronous = async;}

Handler类提供了多少构造器,可以直接指定使用那个线程的Looper。

public Handler(Looper looper)

更多的构造器,请参考源代码。

 

子线程:创建子线程(HandlerThread:默认创建自己的Looper,Thread:如果需要Looper则要自己手动创建),指定子线程需要执行的代码,在执行代码时如果有结果需要反馈给UI线程(如:显示值到UI上),则只要把此Handler(此Handler必须是UI线程的Handler,也就是必须使用的是UI线程的Looper实例)的Message压入到UI线程的MessageQueue中即可。获取此Handler对应的Message实例的方法:可以通过调用Handler的obtainMessage()方法。压入MessageQueue的方法:就是调用Handler中的sendMessage(sendEmptyMessageDelayed、sendEmptyMessageAtTime。。。。根据自己需求选择方法)或者调用Message的sendToTarget()方法,其实这个方法是message调用自己的target变量(存储Handler的实例)的sendMessage(Message msg)方法,然后把自己当成方法的参数传过去。

 

补充:值得注意的是Handler的dispatchMessage方法

Handler部分代码如下:

final Callback mCallback;public interface Callback {        public boolean handleMessage(Message msg);}      /* Subclasses must implement this to receive messages.     */    public voID handleMessage(Message msg) {    }    public voID dispatchMessage(Message msg) {        if (msg.callback != null) {//如果msg有callback下面的都不会执行了            handleCallback(msg);        } else {            if (mCallback != null) {//如果Handler有自己的Callback,则根据返回结果来确定是否执行handleMessage                if (mCallback.handleMessage(msg)) {                    return;                }            }            handleMessage(msg);//此为实现类必须要实现的方法        }    }

 

 

如有不正确或不严谨的地方欢迎指正、探讨。多谢!

总结

以上是内存溢出为你收集整理的android学习(2) 多线程的理解全部内容,希望文章能够帮你解决android学习(2) 多线程的理解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1088719.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存