zoukankan      html  css  js  c++  java
  • 我的Android最佳实践之—— Android更新UI的两种方法:handler与runOnUiThread()

    在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面 显示常会报错。抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)
    话不多说,贴出下面的代码
    方法一:
    在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例, 在这个Handler实例的handleMessage回调函数中调用更新界面显示的函数。
    界面:
    public class MainActivity extends Activity {  
        private EditText UITxt;  
        private Button updateUIBtn;  
        private UIHandler UIhandler;  
       
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            UITxt = (EditText)findViewById(R.id.ui_txt);  
            updateUIBtn = (Button)findViewById(R.id.update_ui_btn);  
            updateUIBtn.setOnClickListener(new View.OnClickListener() {  
                   
                public void onClick(View v) {  
                    // TODO Auto-generated method stub  
                    UIhandler = new UIHandler();  
                    UIThread thread = new UIThread();  
                    thread.start();  
                }  
            });  
        }  
       
        @Override  
        public boolean onCreateOptionsMenu(Menu menu) {  
            getMenuInflater().inflate(R.menu.activity_main, menu);  
            return true;  
        }  
        private class UIHandler extends Handler{  
            @Override  
            public void handleMessage(Message msg) {  
                // TODO Auto-generated method stub  
                super.handleMessage(msg);  
                Bundle bundle = msg.getData();  
                String color = bundle.getString("color");  
                UITxt.setText(color);  
            }  
        }  
        private class UIThread extends Thread{  
            @Override  
            public void run() {  
                try {  
                    Thread.sleep(3000);  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
                Message msg = new Message();  
                Bundle bundle = new Bundle();  
                bundle.putString("color", "黄色");  
                msg.setData(bundle);  
                MainActivity.this.UIhandler.sendMessage(msg);  
                   
            }  
        }  
    }

    更新后:

    方法二:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新 ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI 线程.
        private class UIThread2 extends Thread {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        UITxt.setText("黄色"); 
                    }
                });
     
  • 相关阅读:
    免费的视频、音频转文本
    Errors are values
    Codebase Refactoring (with help from Go)
    Golang中的坑二
    Cleaner, more elegant, and wrong(msdn blog)
    Cleaner, more elegant, and wrong(翻译)
    Cleaner, more elegant, and harder to recognize(翻译)
    vue控制父子组件渲染顺序
    computed 和 watch 组合使用,监听数据全局数据状态
    webstorm破解方法
  • 原文地址:https://www.cnblogs.com/scarecrow-blog/p/5768405.html
Copyright © 2011-2022 走看看