其实可以理解handler为主线程和另外的线程之间进行数据更新的东东,并且handler在主线程中,并在handler直接调用线程的run方法
package com.handler02; import android.app.activity; import android.os.bundle; import android.os.handler; public class handler02activity extends activity { /** called when the activity is first created. */ private handler handler=new handler(); @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); handler.post(thread1); setcontentview(r.layout.main); system.out.println("================main==============="+thread.currentthread().getid()); system.out.println("============main========="+thread.currentthread().getname()); } runnable thread1=new runnable() { @override public void run() { system.out.println("======thread1==============="+thread.currentthread().getid()); system.out.println("========thread1============"+thread.currentthread().getname()); try { thread.sleep(10000); } catch (exception e) { // todo: handle exception } } }; }
结果是主线程等待10s后才显示出来,并且线程id
package com.handler4; import android.app.activity; import android.os.bundle; import android.os.handler; import android.os.message; import android.view.view; import android.widget.textview; public class handler4activity extends activity { /** called when the activity is first created. */ private textview textview; private myhandler myhandler=new myhandler(); @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); textview=(textview)this.findviewbyid(r.id.textview1); } class myhandler extends handler{ //从消息队列中取出并handlemessage处理消息 @override public void handlemessage(message msg) { textview.settext((string)msg.obj); } } public void download(view view){ thread thread=new thread(new runnable() { @override public void run() { try { string s="zhangzhao"; thread.sleep(5000); //数据发送出来 //textview.settext(s); message message=message.obtain();//最好不要new,这个obtain会节省资源 message.obj=s; myhandler.sendmessage(message);//没有指定looper那么就会发送给主线程中的looper } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } } }); thread.start();//会出错原因是在非ui线程里面直接操作ui //主线程维护了一个消息对列,当其他的线程有数据需要传递给主线程的时候,你就把数据封装成一个message对象,然后放在主线程的 //消息队列中去,对应消息的处理由looper,子线程通过handler把下载完的数据封装到message里面,然后把消息取出来交给handler进行处理 //通过handle和message实现两个线程之间达到共享数据 } }
package com.handler5; import android.app.activity; import android.os.bundle; import android.os.handler; import android.os.message; import android.view.view; import android.widget.button; import android.widget.progressbar; import android.widget.textview; public class handler5activity extends activity { /** called when the activity is first created. */ private progressbar progressbar; private button button; private textview textview; private myhandler myhandler=new myhandler(); int i=0; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); progressbar = (progressbar)this.findviewbyid(r.id.progressbar1); textview=(textview)this.findviewbyid(r.id.textview1); } class myhandler extends handler{ @override public void handlemessage(message msg) { int pos =(integer)msg.obj; progressbar.setprogress(pos); textview.settext(pos+"%"); } } public void download(view view){ new thread(new runnable() { @override public void run() { while(i<=100){ try { thread.sleep(300); i+=10; message message=message.obtain(); message.obj=i; myhandler.sendmessage(message); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } } } }).start(); } }
效果:
如对本文有疑问, 点击进行留言回复!!
LongClick原理、上下文菜单原理、EditText长按弹窗原理、WebView长按弹窗自定义、修复WebView全选重复bug ———————————————— 版权声明:本文为CSDN博主「
JobScheduler 实现 特定时间,特定条件(系统空闲,电池电量,磁盘空间 ……)下执行任务
温习Android基础知识——《第一行代码(第三版)》读书笔记 Chapter 10 Service
网友评论