四种异步更新UI的方法
Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,大致有四种方式:
1.使用Handler消息传递机制(推荐)
2.使用AsyncTask异步任务(推荐)
3.使用runOnUiThread(action)方法;
4.使用View的post(Runnabel r)方法;
5.使用handler的post
一.Handler:
public class MainActivity extends Activity { TextView tip;
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
tip.setText("handl更新");
if( msg.what == ){
tip.setText("handl更新");
}
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tip = (TextView)findViewById(R.id.tip);
} protected void myClick(View v){
if( v.getId() == R.id.btn ){
new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep();
}catch (InterruptedException e){
e.printStackTrace();
}
Message msg = handler.obtainMessage();
msg.what = ;
handler.sendMessage(msg);
}
}).start();
}
}
}
二.AsyncTask:
简单示例:
public class MainActivity extends Activity { TextView tip;
MyAsyncTask myAsyncTask; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tip = (TextView)findViewById(R.id.tip); myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();
} class MyAsyncTask extends AsyncTask<Void,String, Boolean>{ // 非UI线程中,独立线程
@Override
protected Boolean doInBackground(Void... params) {
try{
Thread.sleep(*);
}catch (InterruptedException e){
e.printStackTrace();
}
return true;
} // UI线程
@Override
protected void onPostExecute(Boolean aBoolean) {
tip.setText("AsyncTask更新了");
}
};
}
更详细的用法:http://www.cnblogs.com/itfenqing/p/6748261.html
三.runOnUiThread
runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程
public class MainActivity extends Activity { TextView tip; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tip = (TextView)findViewById(R.id.tip); new Thread(new Runnable() {
@Override
public void run() { try{
Thread.sleep(10*1000);
}catch (InterruptedException e){
e.printStackTrace();
} runOnUiThread(new Runnable() {
@Override
public void run() {
tip.setText("runOnUiThread");
}
});
}
}).start();
}
}
四.使用View的post方法:
public class MainActivity extends Activity { TextView tv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tv = (TextView)findViewById(R.id.tip); new Thread(new Runnable() {
@Override
public void run() { try{
Thread.sleep();
}catch (InterruptedException e){
e.printStackTrace();
} tv.post(new Runnable() {
@Override
public void run() {
tv.setText("view post");
}
});
}
}).start();
}
}
五.Handler.post
public class MainActivity extends Activity { TextView tv;
Handler handler; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tv = (TextView)findViewById(R.id.tip);
handler = new Handler(); new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep();
}catch (InterruptedException e){
e.printStackTrace();
} handler.post(new Runnable() {
@Override
public void run() {
tv.setText("home");
}
});
}
}).start();
}
}
可以在子线程里更新的控件及方法:
ProgressBar
ListView 的notifyDataSetChanged()
四种异步更新UI的方法的更多相关文章
- Android异步更新UI的四种方式
Android异步更新UI的四种方式 2015-09-06 09:23 segmentfault 字号:T | T 大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中 ...
- Android异步处理系列文章四篇之二 使用AsyncTask异步更新UI界面
Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ...
- Android异步处理二:使用AsyncTask异步更新UI界面
在<Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面>中,我们使用Thread+Handler的方式实现了异步更新UI界面,这一篇中,我们介绍一种更为简 ...
- 使用AsyncTask异步更新UI界面及原理分析
概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...
- Android 通过广播来异步更新UI
之前的项目里要做一个异步更新UI的功能,可是结果出现了ANR,所以想写个demo来測试究竟是哪个地方出现了问题,结果发现原来的思路是没有问题,郁闷~~ 如今这个demo 就是模拟项目里面 的步骤 1. ...
- Winform实现多线程异步更新UI(进度及状态信息)
引言 在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验.所以在大量数 ...
- http协议里定义的四种常见数据的post方法
原文 https://blog.csdn.net/charlene0824/article/details/51199292 关于http协议里定义的四种常见数据的post方法,分别是: applic ...
- 线程异步更新UI
winform程序一般是不允许非主线程操作ui,单可以通过线程与委托的方式并结合Control类提供的BeginInvoke机制进行ui更改 如下,这是更新ui的方法 private void upU ...
- Flutter学习笔记(31)--异步更新UI
如需转载,请注明出处:Flutter学习笔记(31)--异步更新UI 大家都知道,子线程不能操作UI控件,在我们Android的日常开发中,经常会遇到网络请求数据通过线程间通信,将数据发送到UI线程中 ...
随机推荐
- [ CodeVS冲杯之路 ] P1501
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1501/ 水题一道 直接dfs,记录上当前深度,到了叶子节点就更新答案,并且每个节点将当前深度的计数+1,答案即为ma ...
- [bzoj2301][HAOI2011]Problem B —— 莫比乌斯反演+容斥原理
题意 给定a, b, c, d, k,求出: \[\sum_{i=a}^b\sum_{j=c}^d[gcd(i, j) = k]\] 题解 为方便表述,我们设 \[calc(\alpha, \beta ...
- 嵌入式Linux支持LCD console【转】
转自:http://blog.sina.com.cn/s/blog_664c545f0100v9zl.html 转载:http://www.mculee.cn/post/48.html [1]LCD ...
- JS打印——第三方控件打印
LODOP 官方地址:http://www.lodop.net/ 一个很好的打印控件,可以是实现纸张设置.横打竖打.打印预览.打印维护多种功能.官网的示例非常详细.能很好支持多种浏览器的打印. 在使用 ...
- 利用ICSharpCode进行压缩和解压缩
说说我利用ICSharpCode进行压缩和解压缩的一些自己的一下实践过程 1:组件下载地址 参考文章:C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件 2: 文件类 // ...
- 基于SpringMVC的上传文件实现
基于SpringMVC的上传文件实现 1.项目源码 源码地址:upload 2.关键代码 @RequestMapping("/upload2") public void datal ...
- Guava源码学习(四)新集合类型
基于版本:Guava 22.0 Wiki:New collection types 0. 简介 Guava提供了很多好用的集合工具,比如Multiset和BiMap,本文介绍了这些新集合类型的使用方式 ...
- thinkphp函数学习(2)——microtime, memory_get_usage, dirname, strtolower, is_file
1. microtime() 返回 微秒 秒 这种格式的内容 例子 <?php echo(microtime()); ?> 输出: 0.25139300 1138197510 // 前 ...
- Southern African 2001 框架折叠 (拓扑序列的应用)
本文链接:http://www.cnblogs.com/Ash-ly/p/5398377.html 题目:考虑五个图片堆叠在一起,比如下面的9 * 8 的矩阵表示的是这些图片的边缘框. 现在上面的图片 ...
- codevs 1025 选菜——01背包
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在小松宿舍楼下的不远处,有PK大学最不错的一个食堂—— ...