Android使用Handler的兩種方法

剛剛開始接觸android線程編程的時候,習慣好像java一樣,試圖用下面的代碼解決問題

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

然而發現這樣是不行的,因爲它違背了單線程模型:Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行。查閱了文檔和apidemo後,發覺常用的方法是利用Handler來實現UI線程的更新的。

 

下面代碼的功能很簡單:畫一個圓出來,每隔0.1秒,圓向10移動10個像素。但可以清楚展示利用Handler更新UI的流程。

 

 

 

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

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

創建Activity,代碼如下:

Java代碼 複製代碼
  1. package com.ray.handler;   
  2.   
  3. import android.app.Activity;   
  4. import android.content.Context;   
  5. import android.graphics.Canvas;   
  6. import android.graphics.Color;   
  7. import android.graphics.Paint;   
  8. import android.os.Bundle;   
  9. import android.os.Handler;   
  10. import android.os.Message;   
  11. import android.view.View;   
  12. import android.view.Window;   
  13.   
  14. public class TestHandler extends Activity {   
  15.      protected static final int GUIUPDATEIDENTIFIER = 0x101;    
  16.         
  17.      Thread myRefreshThread = null;    
  18.      BounceView myBounceView = null;    
  19.     
  20.      Handler myHandler = new Handler() {   
  21.           public void handleMessage(Message msg) {    
  22.                switch (msg.what) {    
  23.                     case TestHandler.GUIUPDATEIDENTIFIER:    
  24.                          myBounceView.invalidate();   
  25.                          break;    
  26.                }    
  27.                super.handleMessage(msg);    
  28.           }    
  29.      };   
  30.      public void onCreate(Bundle savedInstanceState) {    
  31.           super.onCreate(savedInstanceState);    
  32.           this.requestWindowFeature(Window.FEATURE_NO_TITLE);    
  33.     
  34.           this.myBounceView = new BounceView(this);   
  35.           this.setContentView(this.myBounceView);    
  36.           new Thread(new myThread()).start();   
  37.      }    
  38.     
  39.      class myThread implements Runnable {    
  40.           public void run() {   
  41.                while (!Thread.currentThread().isInterrupted()) {     
  42.                         
  43.                     Message message = new Message();    
  44.                     message.what = TestHandler.GUIUPDATEIDENTIFIER;    
  45.                        
  46.                     TestHandler.this.myHandler.sendMessage(message);    
  47.                     try {    
  48.                          Thread.sleep(100);     
  49.                     } catch (InterruptedException e) {    
  50.                          Thread.currentThread().interrupt();    
  51.                     }    
  52.                }    
  53.           }    
  54.      }    
  55. }  

文字程序很簡單,一個View,一個Activity,利用handler和postInvalidate()更新UI。

程序效果是一個藍色的正方形向右移出屏幕。

Java代碼 複製代碼
  1. package com.ray.test;   
  2.   
  3. import android.app.Activity;   
  4. import android.content.Context;   
  5. import android.graphics.Canvas;   
  6. import android.graphics.Color;   
  7. import android.graphics.Paint;   
  8. import android.os.Bundle;   
  9. import android.os.Handler;   
  10. import android.view.View;   
  11.   
  12. public class TestHandler extends Activity {   
  13.     private MyView myView;   
  14.     private Handler mHandler;   
  15.     public void onCreate(Bundle savedInstanceState) {   
  16.         super.onCreate(savedInstanceState);   
  17.         myView = new MyView(this);   
  18.         mHandler = new Handler();   
  19.         mHandler.post(update);   
  20.         setContentView(myView);   
  21.     }   
  22.        
  23.     private Runnable update = new Runnable() {   
  24.         public void run() {   
  25.             myView.update();   
  26.             mHandler.postDelayed(update, 5);   
  27.         }   
  28.     };   
  29.        
  30.     class MyView extends View{   
  31.            
  32.         private float x = 0f;   
  33.         public MyView(Context context) {   
  34.             super(context);   
  35.                
  36.         }   
  37.            
  38.         public void update(){   
  39.             postInvalidate();   
  40.         }   
  41.         protected void onDraw(Canvas canvas) {   
  42.             super.onDraw(canvas);   
  43.             x+=1;   
  44.             Paint mPaint = new Paint();   
  45.             mPaint.setColor(Color.BLUE);   
  46.             canvas.drawRect(x, 40, x+4080, mPaint);   
  47.         }   
  48.            
  49.     }   
  50. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章