Android 更新UI的几种方式
1、Activity的 runOnUiThread
textView = (TextView) findViewById( R.id.tv );
new Thread(new Runnable() {
@Override
public void run() { runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText( "更新UI了");
}
});
}
}).start();
android Activity runOnUiThread() 方法使用
2、Handler sendEmptyMessage()
package lib.com.myapplication; import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView textView ; Handler handler = new Handler( ) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.setText( "Ui更新了");
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = (TextView) findViewById( R.id.tv );
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep( 2000 );
} catch (InterruptedException e) {
e.printStackTrace();
} handler.sendEmptyMessage( 2 ) ;
}
}).start(); }
}
3、Handler post()
package lib.com.myapplication;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView textView ; Handler handler = new Handler(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep( 2000 );
} catch (InterruptedException e) {
e.printStackTrace();
} handler.post(new Runnable() {
@Override
public void run() {
textView.setText( "Ui更新了");
}
}) ;
}
}).start(); }
}
在子线程中切换到主线程
new Thread(new Runnable() {
@Override
public void run() {
LogUtil.d( "ttt 11111111111" + Thread.currentThread().getName() );
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
LogUtil.d( "ttt 55555555" + Thread.currentThread().getName() );
}
});
LogUtil.d( "ttt 22222222222" + Thread.currentThread().getName() );
LogUtil.d( "ttt 33333333333" + Thread.currentThread().getName() );
LogUtil.d( "ttt 44444444444" + Thread.currentThread().getName() );
}
}).start();
结果
ttt 11111111111Thread-155
ttt 22222222222Thread-155
ttt 33333333333Thread-155
ttt 44444444444Thread-155
ttt 55555555main
可见这种方式可以快速切换线程,从log日志来看,切换到主线程不会阻塞子线程。
4、view Post()
textView = (TextView) findViewById( R.id.tv );
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep( 2000 );
} catch (InterruptedException e) {
e.printStackTrace();
} textView.post(new Runnable() {
@Override
public void run() {
textView.setText( "Ui更新了");
}
}) ;
}
}).start();
总结:
1、其实上面的四种方式都可归结于一种方式:handler 用于Android线程之间的通信。
2、为什么android要求只能在UI线程进行UI操作? 主要还是为了避免多线程造成的并发的问题。在单线程操作UI是安全的。
Android 更新UI的几种方式的更多相关文章
- Android更新UI的几种方式
之前做过一个Android采集心电图数据的程序,那才是真正的多线程,之前写的小程序:比如下载个文件,从socket接受大一点的数据流然后在ui上更新进度,我都感觉这就叫做多线程了,其实这啥都不算,用个 ...
- Android异步更新UI的四种方式
Android异步更新UI的四种方式 2015-09-06 09:23 segmentfault 字号:T | T 大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中 ...
- UI的线程问题:单线程原因及更新UI的四种方式
1.UI线程为什么设计为单线程? UI控件的操作不是线程安全的,对于多线程并发访问的时候,如果使用加锁机制会导致: UI控件的操作变得很复杂. 加锁的操作必定会导致效率下降. 所以android系统在 ...
- 更新UI的几种方式
在学习Handler的过程中牵涉到UI的更新,在这里就总结一下更新UI的四种方式吧,用法都比较简单,直接看代码就可以了. 一.使用Handler的post方法 新建项目,修改MainActivity代 ...
- Android通过子线程更新UI的几种方式
一般情况下,UI的更新都少不了Handler,首先我们先了解一下Handler机制: Handler消息机制 定义 Message 线程间通信的数据单元,可通过message携带需要的数据创建对象:M ...
- Android开发更新UI的几种方式
1.runOnUiThread 2.handler post 3.handler sendmessage 4.view post xml布局文件: <RelativeLayout xmlns:a ...
- Android:在子线程中更新UI的三种方式
①使用Activity中的runOnUiThread(Runnable) ②使用Handler中的post(Runnable) 在创建Handler对象时,必须先通过Context的getMainLo ...
- 转:探讨android更新UI的几种方法
本文转自:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...
- 【转】探讨android更新UI的几种方法----不错
原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...
随机推荐
- NodeJS POST Request Over JSON-RPC
1.npm install art-template2.npm install request3.在app.js中加入以下代码转html: var template = require('art-t ...
- SQL Server-数据库架构和对象、定义数据完整性(二)
前言 本节我们继续SQL之旅,本节我们如题来讲讲一些基本知识以及需要注意的地方,若有不妥之处,还望指出,简短的内容,深入的理解,Always to review the basics. 数据库架构和对 ...
- FragmentPagerAdapter+ViewPager实现Tab切换效果
1.Activity 加载布局文件,获取Viewpager控件 给ViewPager填充适配器. import android.app.ActionBar; import android.app ...
- MySQL学习笔记十一:数据导入与导出
数据导入 1.mysqlimport命令行导入数据 在使用mysqlimport命令导入数据时,数据来源文件名要和目标表一致,不想改文件名的话,可以复制一份创建临时文件,示例如下. 建立一个文本use ...
- 关于MyCAT字符集的验证
MyCAT默认字符集是UTF8 下面通过查看日志来验证不同的MySQL客户端字符集和服务器字符集对于MyCAT的影响. 日志中与字符集有关的主要有三部分: 1. 初始化MyCAT连接池 2. 心跳检测 ...
- 如何在制作jar包时引用第三方jar包
我用的是Eclipse打包,但在CMD窗口执行的时候报“ActiveMQ.jar中没有主清单属性”错误. 在网上搜了下,这个与MANIFEST.MF文件有关,该文件没有定义MAIN方法所在类的路径,利 ...
- PowerPoint基础
一.基础 默认后缀ppt,pptx office2003和以后的版本只支持ppt, 可以将pptx另存为ppt97-2003 二.修改PPT尺寸 三.新建幻灯片 四.字体与段落设置 五.主题与字体 六 ...
- 理解HTTP协议
在互联网时代HTTP协议的重要性无需多言,对于技术岗位的同学们来说理解掌握HTTP协议是必须的.本篇博客就从HTTP协议的演进.特性.重要知识点和工作中常见问题的总结等方面进行简单的介绍.理解掌握了这 ...
- Sublime插件支持Sass编译和Babel解析ES6 & .sublime-build文件初探
用Sublime Text蛮久了,配置配来配去的,每次换电脑都得重头再配过,奈何人老了脑子不中用了,得好好整理一些,下次换电脑就有得参考了.. 同事说,他的WebStorm简直太方便,自身集成了很多方 ...
- Python_Day_02 str内部方法总结
刚开始学习Python,看了一天的字符串内部方法,现在来总结一下. capitalize(self) 将一句话的首字母变大写,其他字母都变小 name = "love PyThon" ...