使用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();取消掉圈圈。然后我們看到的就是更新好的界面了。

 

  以上只是,簡潔化的代碼和口頭的語言,應該還比較易懂。

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM