zoukankan      html  css  js  c++  java
  • 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是安全的。

  • 相关阅读:
    JavaScript Window
    3.1.3 背景音乐播放技术
    6.1 多媒体相关基本概念及计算问题
    11.5 知识产权考点讲解
    第15课 TortoiseGit程序操作介绍
    第16课 “远程 Git文档库” 的基础操作
    第11课 Git GUI程序的基本功能
    第12课 使用Git GUI
    第13课 SmartGit程序操作介绍
    第14课 SourceTree程序操作介绍
  • 原文地址:https://www.cnblogs.com/zhaoyanjun/p/5546683.html
Copyright © 2011-2022 走看看