利用Handler来更新android的UI

转载自:http://rayleung.iteye.com/blog/411860 

 

刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题

Java代码
  1. new Thread( new Runnable() {    
  2.     publicvoid run() {    
  3.          myView.invalidate();   
  4.      }           
  5. }).start();    
 new Thread( new Runnable() {   
    public void run() {   
         myView.invalidate();  
     }          
}).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. publicclass BounceView extends View { 
  12.     float x = 40
  13.      
  14.     public BounceView(Context context) {  
  15.          super(context);  
  16.     }  
  17.  
  18.     @Override  
  19.     protectedvoid onDraw(Canvas canvas) {  
  20.         x+=10
  21.         Paint mPaint = new Paint(); 
  22.         mPaint.setAntiAlias(true); 
  23.         mPaint.setColor(Color.GREEN); 
  24.         canvas.drawCircle(x, 40, 40, mPaint); 
  25.     } 
package com.ray.handler;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.view.View;

public class BounceView extends View {
    float x = 40;
    
    public BounceView(Context context) { 
         super(context); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
    	x+=10;
    	Paint mPaint = new Paint();
    	mPaint.setAntiAlias(true);
    	mPaint.setColor(Color.GREEN);
    	canvas.drawCircle(x, 40, 40, mPaint);
    }
}

 

创建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. publicclass TestHandler extends Activity { 
  15.      protectedstaticfinalint GUIUPDATEIDENTIFIER = 0x101;  
  16.       
  17.      Thread myRefreshThread = null;  
  18.      BounceView myBounceView = null;  
  19.   
  20.      Handler myHandler = new Handler() { 
  21.           publicvoid handleMessage(Message msg) {  
  22.                switch (msg.what) {  
  23.                     case TestHandler.GUIUPDATEIDENTIFIER:  
  24.                          myBounceView.invalidate(); 
  25.                          break;  
  26.                }  
  27.                super.handleMessage(msg);  
  28.           }  
  29.      }; 
  30.      publicvoid 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.           publicvoid 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.      }  
posted @ 2013-03-21 16:16  浪儿~  阅读(178)  评论(0)    收藏  举报