首页 > 编程知识 正文

androidhandler作用(uipath实训总结)

时间:2023-05-06 07:42:18 阅读:75872 作者:4206

在Android系统中,需要使用子线程来执行需要较长时间才能执行的操作,线程执行完成后线程将自动销毁。 但是,如果每一步都有许多耗时的操作,那么如果继续创建和运行新线程,而继续销毁线程,性能将大幅下降,该怎么办? android为您提供了两种方法:一种是使用本文中介绍的HandlerThread,另一种是使用线程池管理线程。

一、简单1.handlerthreadhandlerthread=new handler thread (' myhandler thread ),通过创建实例对象//参数来表示线程名称;2.启动HandlerThread线程

handlerThread.start (;3.构建循环消息处理机制

mhreadhandler=new handler (mhandle rthread.get looper () @ overridepublicvoidhandlemessage (消息msg )//耗时的操作)4.退出循环

当您不再需要处理耗时的任务时,您需要停止looper并回收资源

mHandlerThread.getLooper(.quit ) )或mhandle rthread.get looper (.quit safely )、源代码分析1 .构建方法publichandlerthread ),和} publichandlerthread (字符串名称,int优先级) (super ) name; 优先级=优先级; }传递的字符串参数是线程的名称,整形参数是线程的优先级,如果未指定线程优先级,则会设置为默认优先级

2.run (方法和getLooper )方法public void run ) { mTid=Process.myTid; Looper.prepare (; //带有锁定机制的当前线程的Looper对象synchronized(this ) { mLooper=Looper.myLooper ); //通知当前线程已成功创建mLooper对象。 这里主要是getLooper方法的wait notifyAll (; //设置线程优先级级别process.setthreadpriority (mpriority )//其中默认为空方法的实现。 为了便于扩展onLooperPrepared (),可以重写此方法,以便在线程开始前做好准备。 Looper.loop (; mTid=-1; }公共looper get looper () ) if (! isAlive () { return null; //线程获取Looper对象之前,不会创建Looper对象。 不创建Looper,而是同步(this ) while(isalive ) ) m looper==空(try ) wait ); } catch (互联互通) { } } } return mLooper; 使用HandlerThread时,必须调用start (方法。 start ) )时,线程调度到虚拟机,虚拟机调用run方法完成looper初始化。 在这里,为了确保线程同步,还使用了锁在looper实例化完成后检索该对象。

3 .调用3.quit (方法和quitSafe )方法//退出此方法,然后退出线程公共布尔队列) { Looper looper=getLooper; if(looper!=null(looper.quit ); 返回真; }返回假; //调用此方法以安全地结束线程@ targetapi (build.version _ codes.jelly _ bean _ mr2 ) public boolean quitSafely ) loper=null(looper.quitsafely ); 返回真; }返回假; }这两个方法最后都调用与looper对象对应的方法

void quit (布尔安全) if (! mquitallowed (thrownewillegalstateexception (' mainthreadnotallowedtoquit.' ); }同步(this ) if ) mquitting ) { return; } mQuitting=true; //安全退出并调用此方法if(safe ) ({已移动lfuturemessageslocked } ); } else {//调用此方法而不安全退出的removeAllMessagesLocked (; } //We can assume mPtr!=0becausemquittingwaspreviouslyfalse.native wake (mptr; }} removeAllMessagesLocked()

私密性voidremoveallmessageslocked () {消息p=m消息; while(p!=null}{messagen=p.next; p .回复取消检查(; p=n; } m消息=null; }不安全的退出遍历消息链表并回收所有消息

removeAllFutureMessagesLocked()

privatevoidremoveallfuturemessageslocked ({ finallongnow=system clock.uptime millis ); 消息p=m消息; if(p!=null(//确定当前队列中的消息是否正在处理此消息,否则直接删除所有回调if(p.whennow ) ) { removeAllMessagesLocked; (else(/如果正在处理,则等待该消息的处理完成,然后返回该循环消息n; for (; ({ n=p.next; if(n==null ) { return; (if ) n.whennow ) { break; (p=n; } p.next=null; do { p=n; n=p.next; p .回复取消检查(; }while(n!=null; }}安全退出根据名为Message.when的属性确定消息队列当前是否正在处理消息。 如果没有处理消息,则直接删除所有回调;如果正在处理,则等待消息处理完成,然后退出循环。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。