使用Handler类来更新UI

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

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

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

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

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

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

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

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

 

  假设一种状况:要访问网络,找到一段句子,而后更新咱们的TextViewblog

 

  

  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();取消掉圈圈。而后咱们看到的就是更新好的界面了。it

 

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

相关文章
相关标签/搜索