zoukankan      html  css  js  c++  java
  • Android 更新UI的两种方法——handler和runOnUiThread(

    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回调函数中调用更新界面显示的函数。
     
    界面:
    [html]  
    <span style="font-size:14px;">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);  
                  
            }  
        }  
    }</span>  
    更新后:www.2cto.com
    方法二:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程
    [html]  
    FusionField.currentActivity.runOnUiThread(new Runnable()    
            {    
                public void run()    
                {    
                    Toast.makeText(getApplicationContext(), , "Update My UI",    
                            Toast.LENGTH_LONG).show();    
                }    
        
            });    
     
  • 相关阅读:
    antdvue 全局配置loading
    eslint使用
    chrome浏览器跨域请求cookie丢失问题(一直报验证码错误,因为未携带sessionid)
    [2021BUAA软工_助教博客]作业成绩汇总
    将list按指定大小分为n组
    关于sql中group by使用的一些注意点
    Java调用webservice请求
    windows系统查看用户sid
    高等软工期末作业《课程总结》
    成年人最大的智慧:认清自己
  • 原文地址:https://www.cnblogs.com/kevincode/p/3892804.html
Copyright © 2011-2022 走看看