利用Handler来更新android的UI

刚刚开始接触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. }  
posted @ 2013-03-07 14:50  armysheng  阅读(236)  评论(0编辑  收藏  举报