利用Handler来更新android的UI

原文地址:http://rayleung.javaeye.com/blog/411860

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

Java代码
  1.   new  Thread(  new  Runnable() {     
  2.     public   void  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的流程。

 

123

 

首先创建简单的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. }  
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. 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.      }   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值