详解Android UI更新的几种方法
前言
在android开发中,界面ui的更新都是在主线程来完成的。线程分为主线程(main thread,简称mt)和工作线程(work thread,简称wt),我们通常会在wt中执行一些比较耗时的操作,比如下载,网络,缓存等,然后在将结果发送给mt进行ui的更新操作。如果是在wt进行ui的更新,则会抛出异常,android.view.viewroot$calledfromwrongthreadexception: only the original thread that created a view hierarchy can touch its views.(只有创建这个view的原始线程才能修改这个view)。
在bt搜索、wifi搜索、其他需要更新view的ui过程中,很多是采用广播的方式通知搜索的结果,实时的显示到listview中进行ui的更新操作。通常会使用以下几种方式进行ui的更新:handler,runonuithread,子线程发送message。
一、activity.runonuithread
利用activity.runonuithread(runnable)把更新ui的代码创建在runnable中,然后在需要更新 ui时,把这个runnable对象传给activity.runonuithread(runnable)。这样runnable对像就能在ui程序中被调用。如果当前线程是ui线程,那么行动是立即执行。如果当前线程不是ui线程,操作是发布到事件队列的ui线程。
mactivity.runonuithread(new runnable() { @override public void run() { log.e(tag, "开始添加设备!"); adddevice(device); } });
二、handler.post(runnable)
handler.post(new runnable() { @override public void run() { adddevice(device); } });
三、子线程发送message
首先在需要执行更新的位置添加以下代码
new thread(new runnable() { @override public void run() { //message msg = new message(); //msg.what = 0x06; //handler.sendmessage(msg); handler.sendemptymessage(0x06); } }).start();
然后进入handler下进行处理
final handler handler = new handler() { @override public void handlemessage(message msg) { switch (msg.what) { case 0x06: adddevice(device); break; default: break; } super.handlemessage(msg); } };
以上三种方法都可以实现ui的更新,掌握哪种方式取决于代码中的叠加度,不过个人推荐使用方法一。希望对大家的学习有所帮助,也希望大家多多支持。