Android蓝牙模块接受到的输入流要显示在程序中另一个Activit中,并且实时更新数据
Android UI线程非安全
不能在工作线程中操作UI,所有UI操作必须在主线程(又名UI线程)两个原则:
非主线程处理后的数据需要更新至主线程UI界面,通常可以就需要用hannler处理。
基本原理:主线程起来以后有一个MessageQueue,同时和该队列配对的有一个Looper,而子线程有这个MessageQueue的引用,子线程处理完以后就会向主线程的消息队列发消息,主线程轮询自己的队列,发现有未处理的消息就进行处理。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
在Android中规定只有UI thread可以更新界面,但是我们开发中会经常遇到一些耗时的操作,这些操作可能会很花费时间,最终的结果却要更新到UI上
这种情况下,如果我们将这个操作放到UI thread中做就很可等挡住UI线程,从而导致ANR Application Not Responding,因此我们都会new一个工作
线程,在这个线程中做复杂的耗时操作,待得到结果后,再将结果更新到UI。
子线程获取数据,更新UI的方法大概有这样几种:
1、通过AsyncTask+progressbar的方法,在AsyncTask的doInBackground()中做耗时的操作,在onProgressUpdate(Progress…) 中更新UI(进度条)
此方法在主线程执行,用于显示任务执行的进度。onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回。
2、通过Handler的方法,从子线程中发消息Msg,在Handler中处理该消息(在UI thread中执行),并updateUI。
3、如果你的界面是listView的形式,不妨用listAdapter绑定数据库,在子线程接收到实时数据跟新到provider中,然后触发listView的自动更新。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。