zoukankan      html  css  js  c++  java
  • 使用Handler类来更新UI

      在android里面,我们经常要上网获取一些数据,然后更新UI,但获取数据是要时间的,如果在主线程里面直接使用获取数据的代码的话。整个activity就会卡在那,直至你获取到数据更新完UI才会加载完成。在android里面,如果一个activity卡了5秒,就会被强制回收掉。

      回想一下我们用过的App,遇到要加载的时候,一般是怎么样的呢?肯定不会是让界面卡死在那里的,最不济的也有一个"加载中"的圈圈在那转吧!然后数据加载出来后就消失。

      然而android有个很微妙的机制,更新UI只能在UI线程,就是在我们的主线程,而访问网络只能在其他线程,要怎么办呢?答案就是使用Handler类。

      主要的思路是这个样子的:

      1、让程序一开始就有一个“加载中”的圈圈(Dialog)。

      2、Handler是在主线程实例化的,属于主线程。

      3、在主线程开启另一个线程,用来访问网络加载数据,加载完后,发消息给Handler类。

      4、Handler收到消息后,更新UI,再取消那个"加载中"的圈圈。

      假设一种情况:要访问网络,找到一段句子,然后更新我们的TextView

      
    
      private Handler handler;//声明Hanler
    
      private TextViwe tv;//声明TextView
    
      
    
      
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first_page);
    
    
     //在主线程中实例化Handler  
      handler = new Handler(){
    
        @Override
      //收到消息时该做的事情
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
    
    
        //更新TextView UI
    
        
        //取消掉"加载中"的框框
            dialog.cancel();
    
    
        }
    };
    
    
    //创建一个窗口来等待加载
    dialog = new ProgressDialog(this);
    dialog.setMessage("数据初始化中...");
    dialog.setCancelable(false);
    dialog.setCanceledOnTouchOutside(false);
    dialog.show();
    
    //开启新的线程来访问网络,获取数据
    new Thread(new Runnable() {
        @Override
        public void run() {
    
        //访问网络        
    
        //给Handler发消息
            Message ok = new Message();
            handler.sendMessage(ok);
    
    
        }
    }).start();
    
    
    
    
    
    
    
    
    
    
    
    
    }//end onCreate
    
    
      

      简述一下activity运行的顺序: 一开始打开App时,activity会把所有的声明啊,实例化啊,布局啊什么的都弄好。而后就进入到dialog.show();这个地方,然后整个界面就是一个圈圈在转啊转啊。同时,开启了一个线程去访问网络。即时一个线程在转啊转圈圈(Dialog),另一个线程去访问了网络,获取数据,互不干扰。等到获取完数据后,会实例化一个Message类,给Handler发信息。Handler接收到信息后,更新UI,然后dialog.cancel();取消掉圈圈。然后我们看到的就是更新好的界面了。

      以上只是,简洁化的代码和口头的语言,应该还比较易懂。

     

      

  • 相关阅读:
    关于iOS开发property with 'retain(or strong)' attribute must be of object type
    机器学习之神经网络
    一些知名的开源社区
    机器学习之正则化
    机器学习之逻辑回归(logistic回归)
    机器学习之正规方程法
    机器学习之线性回归、多项式回归
    机器学习之梯度下降法
    64位windows7下安装python,配置numpy和matplotlib库
    mysql分区查询
  • 原文地址:https://www.cnblogs.com/wzben/p/5055751.html
Copyright © 2011-2022 走看看