1. Android的UI时线程不安全的,如果在子线程中更新UI会出现异常,导致程序崩溃。
为了解决如上这些问题,我们常用的做法就是使用Android的异步消息机制实现即可(创建一个Message对象,使用Handler发送出去,然后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作)。所以说还是很有必要了解异步消息机制的Looper , Handler , Message等原理的。
下面展示一个示例使用,然后通过源码分析吧。
public class MainActivity extends Activity {
public static final int UPDATE_TEXT = 1;
private TextView text;
private Button changeText;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case UPDATE_TEXT:
text.setText("Nice yo see you again");
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text);
changeText = (Button) findViewById(R.id.change_text);
// changeText.setOnClickListener(this);
changeText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
switch ((view.getId())){
case R.id.change_text:
new Thread(new Runnable() {
@Override
public void run() {
// 若直接更新TextView的内容会报错,下面使用异步消息处理机制
// text.setText("Nice to see you,BUG");
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
break;
default:
break;
}
}
});
}
}
这里我们先是定义了一个整型常量UPDATE_TEXT,用于表示更新TextView 这个动作。然后新增一个Handler 对象,并重写父类的handleMessage 方法,在这里对具体的Message进行处理。如果发现Message 的what 字段的值等于UPDATE_TEXT,就将TextView 显示的内容改成Nice to see you again。
下面再来看一下Change Text 按钮的点击事件中的代码。可以看到,这次我们并没有在子线程里直接进行UI 操作,而是创建了一个Message(android.os.Message)对象,并将它what 字段的值指定为UPDATE_TEXT,然后调用Handler 的sendMessage()方法将这Message 发送出去。很快,Handler 就会收到这条Message,并在handleMessage()方法中对它进行处理。注意此时handleMessage()方法中的代码就是在主线程当中运行的了,所以我们可以放心地在这里进行UI 操作。接下来对Message 携带的what 字段的值进行判断,如果等于UPDATE_TEXT,就将TextView 显示的内容改成Nice to see you again。
常用的APP在线自动化测试工具:
http://www.ineice.com
分享到:
相关推荐
ndroid异步处理一:使用Thread+Handler实现非UI线程更新UI界面
使用开发工具为VS2013;.net:4.0 多线程异步刷新ui界面,实时获取任务进度并进行反馈。
Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面。
Winform实现多线程异步更新UI(进度及状态信息) 实例代码
WPF后台线程更新UI---http://www.tuicool.com/articles/NbieE3M
qt编程_在子线程中更新UI界面
新线程中发送Handle消息,主线程中处理消息并更新TextView的值
WinForm C# 多线程编程并更新界面(UI)
PyQt5中异步刷新UI和Python中的多线程总结 ...涉及到PyQt5中异步刷新UI+Python中的多线程+python中使用subprocess。可结合我的博客学习https://blog.csdn.net/u013247461/article/details/85063455
目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python方便的编程。近期遇到界面中执行一些后台任务时界面卡死的情况,解决了在这里记录下。...– PyQt5.QtGui UI类,如QFont –
引言 在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要...下面就开始一步步的去实现异步线程更新ui的demo程序吧。 应用背景 写入一定量的数据到文本文件中,同时需要在主界面中反应出写入数据的
首先明确Android之所以有Handler和AsyncTask 都是为了不阻塞主线程(UI线程) 且UI的更新只能在主线程中完成 因此异步处理是不可避免的 Android为了降低这个开发难度 提供了AsyncTask AsyncTask就是一个封装过的...
假如有耗时操作,比如:在子线程中下载文件,通知ui线程下载进度,ui线程去更新进度等,这个时候我们就需要用到异步消息处理。 一、什么是Handler Handler是Android提供用来异步更新UI的一套机制,也是一套消息处理...
在.NET中如需在非UI线程中改变UI控件属性时,CLR会抛出异常,提示无法在非UI线程中更新界面上的控件(Cross-thread operation not valid)。一般情况下有两种解决办法。
Android 提供了一个好用的工具---AsyncTask ,方便我们在子线程中对 UI 进行操作,AsyncTask 背后的实现原理也是基于异步消息处理机制的。
本篇文章主要介绍了浅谈Android中使用异步线程更新UI视图的几种方法,具有一定的参考价值,有兴趣的可以了解一下
大家都知道由于性能要求,Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正: 使用Handler消息传递机制; 使用AsyncTask异步任务; 使用runOnUiThread(action)方法...
线程池(多线程)+异步+委托(lamdba)+UI跨线程(界面实时响应)+递归(树形实时更新)+TCPIP扫描,综合起来的一个实例,对于初学者有很大的帮助