您现在的位置是:首页 > 文章详情

Android 更新UI的几种方式

日期:2017-05-15点击:385
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是安全的。

 

原文链接:https://yq.aliyun.com/articles/303948
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章