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的方法的更多相关文章

  1. Android异步更新UI的四种方式

    Android异步更新UI的四种方式 2015-09-06 09:23 segmentfault 字号:T | T 大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中 ...

  2. Android异步处理系列文章四篇之二 使用AsyncTask异步更新UI界面

    Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ...

  3. Android异步处理二:使用AsyncTask异步更新UI界面

    在<Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面>中,我们使用Thread+Handler的方式实现了异步更新UI界面,这一篇中,我们介绍一种更为简 ...

  4. 使用AsyncTask异步更新UI界面及原理分析

    概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...

  5. Android 通过广播来异步更新UI

    之前的项目里要做一个异步更新UI的功能,可是结果出现了ANR,所以想写个demo来測试究竟是哪个地方出现了问题,结果发现原来的思路是没有问题,郁闷~~ 如今这个demo 就是模拟项目里面 的步骤 1. ...

  6. Winform实现多线程异步更新UI(进度及状态信息)

    引言 在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验.所以在大量数 ...

  7. http协议里定义的四种常见数据的post方法

    原文 https://blog.csdn.net/charlene0824/article/details/51199292 关于http协议里定义的四种常见数据的post方法,分别是: applic ...

  8. 线程异步更新UI

    winform程序一般是不允许非主线程操作ui,单可以通过线程与委托的方式并结合Control类提供的BeginInvoke机制进行ui更改 如下,这是更新ui的方法 private void upU ...

  9. Flutter学习笔记(31)--异步更新UI

    如需转载,请注明出处:Flutter学习笔记(31)--异步更新UI 大家都知道,子线程不能操作UI控件,在我们Android的日常开发中,经常会遇到网络请求数据通过线程间通信,将数据发送到UI线程中 ...

随机推荐

  1. 乌班图 root权限获取

    点击左侧终端标 2 出现命令提示符 3 首先输入:sudo passwd root(设置root密码) 4 输入当前系统的账户密码(账户:admin-pc的密码) 5 输入新的root密码,确认新密码 ...

  2. Java并发编程--AQS

    概述 抽象队列同步器(AbstractQueuedSynchronizer,简称AQS)是用来构建锁或者其他同步组件的基础框架,它使用一个整型的volatile变量(命名为state)来维护同步状态, ...

  3. RQNOJ123_多人背包_C++_Pascal

    题目:http://www.rqnoj.cn/problem/123 不得不说,RQNOJ 的机子跑得好慢呀,5*107 的数据范围本地跑 0.2s,服务器上愣是把我卡掉了,最后只好写了一份 Pasc ...

  4. Oracle 数据库维护相关

    版本升级 在维护数据库升级的过程中,会产生n个脚本.谈谈我所处的项目背景,项目数据库最早版本假定为1,最后在多次维护后,版本号,可能变更为16.那么针对项目上不同的数据库版本,如何来进行升级呢? 我使 ...

  5. php5.3+ 安装(mysqlnd )

    摘自:http://blog.csdn.net/dragon8299/article/details/6273295 如何安装mysqlnd LINUX环境中,默认情况下,php中的mysql扩展还是 ...

  6. Java接口中的成员变量的意义

    转自:http://blog.csdn.net/ameyume/article/details/6189749 在interface里面的变量都是public static final 的.所以你可以 ...

  7. laravel-u-editor工具栏语言切换的方法

    更改/config/app.php/locale,可支持en,zh_CN,zh_TW,我们一般设为zh_CN

  8. log4j - 1

    具体内容: 1.       如何在项目中配置log4j使得该系统可以输出web test的日志文件(自定义格式)到工程dist目录下的junitLog/WebTestLog.log目录下,输出508 ...

  9. App Class Loader

    Java本身是一种设计的非常简单,非常精巧的语言,所以Java背后的原理也很简单,归结起来就是两点: 1.JVM的内存管理 理解了这一点,所有和对象相关的问题统统都能解决 2.JVM Class Lo ...

  10. [JOISC2016]サンドイッチ

    题目大意: 一个$n\times m(n,m\leq400)$的网格图中,每个格子上放了两个三明治,摆放的方式分为'N'和'Z'两种.一个三明治可以被拿走当且仅当与该三明治的两条直角边相邻的三明治均被 ...