忠诚与背叛,婴儿洗澡豪华版,湖北泰尔生物工程有限公司
在android开发中,有主线程(ui线程)和工作线程(worker线程)之分,两个线程是相互独立的,并不能相互访问(主线程主要负责ui的更新,不能进行耗时的操作,工作线程主要负责耗时的操作,但不能进行ui的更新),所以要在两个线程之间进行数据传递,就需要handler作为传递数据的桥梁。每一个handler对象,都与独立的线程以及线程的消息队列有关。本文仅供学习分享使用。
如下图所示:
创建一个内部类继承handler
1 /* 2 创建一个内部handler类 3 */ 4 class networkhandler extends handler{ 5 6 @override 7 public void handlemessage(message msg) { 8 log.i("demohandler", "run: thread id2="+thread.currentthread().getname()); 9 string s = (string) msg.obj; 10 txtinfo.settext(s); 11 } 12 }
创建一个内部类,继承thread
1 /* 2 创建一个线程内部类 3 */ 4 class networkthread extends thread{ 5 @override 6 public void run() { 7 log.i("demohandler", "run: thread id1="+thread.currentthread().getname()); 8 //模拟网络获取,当执行时休眠2秒钟 9 try { 10 thread.sleep(2*1000); 11 } catch (interruptedexception e) { 12 e.printstacktrace(); 13 } 14 //通过handler将线程数据,发送到消息队列中 15 //1. looper将消息队列中的消息对象取出。 16 //2. looper找到消息对象对应的handler对象 17 //3. looper将会调用handler对象中的handlemessage(msg)方法,处理对象 18 string s="这是一个线程中的数据"; 19 message msg=handler.obtainmessage(); 20 msg.what=1; 21 msg.obj=s; 22 handler.sendmessage(msg); 23 } 24 }
启动线程
1 public void click_me(view v){ 2 //点击事件中启动一个线程 3 thread thread=new networkthread(); 4 thread.start(); 5 }
调试输出信息(两个分属不同的线程)
1 04-25 22:56:37.424 18601-18786/com.hex.demohandler i/demohandler: run: thread id1=thread-4 2 04-25 22:56:39.425 18601-18601/com.hex.demohandler i/demohandler: run: thread id2=main 3 04-25 22:56:55.491 18601-18800/com.hex.demohandler i/demohandler: run: thread id1=thread-5 4 04-25 22:56:57.492 18601-18601/com.hex.demohandler i/demohandler: run: thread id2=main
大多数情况下,在worker thread中修改view是不可以的,小部分是可以的,如progressbar 。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android apk 项目一键打包并上传到蒲公英的实现方法
Android 自定义LineLayout实现满屏任意拖动功能的示例代码
android 限制某个操作每天只能操作指定的次数(示例代码详解)
Android 集成 google 登录并获取性别等隐私信息的实现代码
网友评论