閱讀211 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何利用Handler更新android的UI

 

提出問題

新手剛開始接觸Android線程編程的時候,會想到如下使用如下代碼:

複製到剪貼板  Java代碼
  1. new Thread( new Runnable() {    
  2.     public void run() {    
  3.          myView.invalidate();   
  4.      }           
  5. }).start();  


 

但是:該實現方法是不可行的。

分析問題:

因為:Android UI操作並不是線程安全的,這些操作必須在UI線程中執行

1.myView.invalidate()是UI操作;

2.new Thread創建了一個新的線程,是一個子線程,而不是UI線程,在這個新的線程裏麵對view進行刷新,這樣是不安全的。

解決問題:

那麼如何解決這個問題呢?

答案:使用Handler來實現UI線程的更新的。

實現步驟:

1.在view類裏麵定義一個Handler變量,這並沒有開啟一個新的線程,因此在handler裏麵更新本view是安全的;

2.然後我們創建一個線程,通過這個線程來給activity的handler變量發送消息,同時通過這個線程進行延時。

 

意即:

1.Handler接收消息和處理消息;

2.創建一個線程,來給Handler發送消息;

 

消息處理三部曲:

1.發送消息;

2.接收消息;

3.處理消息;

代碼參考

首先創建簡單的View,代碼如下:

複製到剪貼板  Java代碼
  1. package com.ray.handler;  
  2. import android.content.Context;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Color;  
  5. import android.graphics.Paint;  
  6. import android.graphics.Point;  
  7. import android.graphics.drawable.Drawable;  
  8. import android.view.View;  
  9.    
  10. public class BounceView extends View {  
  11.    
  12.     float x = 40;  
  13.     public BounceView(Context context) {  
  14.          super(context);  
  15.     }  
  16.    
  17.     @Override  
  18.     protected void onDraw(Canvas canvas) {  
  19.          x+=10;  
  20.          Paint mPaint = new Paint();  
  21.          mPaint.setAntiAlias(true);  
  22.          mPaint.setColor(Color.GREEN);  
  23.          canvas.drawCircle(x, 40, 40, mPaint);  
  24.     }  
  25. }  
  26.    


創建Activity類,代碼如下:

複製到剪貼板  Java代碼
  1. package com.ray.handler;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.os.Bundle;  
  8. import android.os.Handler;  
  9. import android.os.Message;  
  10. import android.view.View;  
  11. import android.view.Window;  
  12.    
  13. public class TestHandler extends Activity {  
  14.      protected static final int GUIUPDATEIDENTIFIER = 0x101;  
  15.    
  16.      Thread myRefreshThread = null;  
  17.      BounceView myBounceView = null;  
  18.    
  19.      Handler myHandler = new Handler() {//在主線程中創建Handler對象  
  20.           public void handleMessage(Message msg) {//處理消息  
  21.                switch (msg.what) {  
  22.                     case TestHandler.GUIUPDATEIDENTIFIER://  
  23.                          myBounceView.invalidate();//UI界麵更新  
  24.                          break;  
  25.                }  
  26.                super.handleMessage(msg);  
  27.           }  
  28.      };  
  29.    
  30.    
  31.      public void onCreate(Bundle savedInstanceState) {  
  32.    
  33.           super.onCreate(savedInstanceState);  
  34.           this.requestWindowFeature(Window.FEATURE_NO_TITLE);  
  35.           this.myBounceView = new BounceView(this);  
  36.           this.setContentView(this.myBounceView);  
  37.    
  38.           new Thread(new myThread()).start();//創建一個子線程  
  39.    
  40.      }  
  41.    
  42. //線程類,這個線程隻是發送消息,然後延時而已。  
  43.    
  44.      class myThread implements Runnable {  
  45.    
  46.           public void run() {  
  47.    
  48.                while (!Thread.currentThread().isInterrupted()) {   
  49.    
  50.                       
  51.    
  52.                     Message message = new Message();  
  53.    
  54.                     message.what = TestHandler.GUIUPDATEIDENTIFIER;  
  55.    
  56.                       
  57.    
  58.                     TestHandler.this.myHandler.sendMessage(message); //發送一次消息,自動調用上麵handler類的handleMessage函數,從而更新view類。  
  59.    
  60.                     try {  
  61.    
  62.                          Thread.sleep(100); //延時  
  63.    
  64.                     } catch (InterruptedException e) {  
  65.    
  66.                          Thread.currentThread().interrupt();  
  67.    
  68.                     }  
  69.    
  70.                }  
  71.    
  72.           }  
  73.    
  74.      }  
  75.    
  76. }  

最後更新:2017-04-02 06:51:48

  上一篇:go 7.1.5 選項卡結合案例詳解
  下一篇:go android多任務同時下載