Android 更新UI的几种方式
2016-06-12 19:11
441 查看
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是安全的。
相关文章推荐
- packet for query is too large <1781> 1024 >. you can change this value on the server by setting the
- 【Mongo】MongoVUE的使用
- 聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
- Vue.js结合webpack开发时,webpack环境的搭建
- EasyUi+Ajax实现二级联动
- Ugui美术字的使用
- break和continue
- 体外诊断(POCT)之无窗口界面库:VGUI
- 触发UIButton长按事件
- [SIM] The maximum transfer rate between "UE" and "SIM card"
- 异常org.jetbrains.android.uipreview。RenderingException:未能加载
- button 设置圆角、View设置圆角以及Button图文位置
- RequireJS入门(二)
- VUEJS 实战教程第二章,修复错误并且美化时间
- JAVA 中线程队列BlockingQueue的使用
- qml LAVFSplitter播放器
- 获取easyui-combobox value值
- UVa 133 The Dole Queue
- Unreal Engine4(虚幻4)学习心得-获取UE4
- Java编程开发设计模式之--建造者模式(Builder)