现在的位置: 首页 > 综合 > 正文

关于利用Handler更新Android UI的另一种方法

2013年07月02日 ⁄ 综合 ⁄ 共 5428字 ⁄ 字号 评论关闭

原作者:

文字程序很简单,一个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. }  

 之前还写过另外一篇关于Handler更新UI的文章:

http://rayleung.iteye.com/blog/411860

回复人:(不需要handler)

你的两篇文章对于invalidate()和postInvalidate()认识有些问题
http://www.iteye.com/topic/435147
http://rayleung.iteye.com/blog/411860

调用Handler.post(Runnable r)方法,Runnable运行在UI所在线程,所以可以直接调用View.invalidate()

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(new Runnable(){  
  20.             @Override  
  21.             public void run() {  
  22.                 myView.invalidate();  
  23.                 mHandler.postDelayed(this5);  
  24.             }  
  25.          });  
  26.         setContentView(myView);  
  27.     }  
  28.       
  29.     class MyView extends View{  
  30.         private float x = 0f;  
  31.         public MyView(Context context) {  
  32.             super(context);  
  33.               
  34.     }  
  35.         protected void onDraw(Canvas canvas) {  
  36.             super.onDraw(canvas);  
  37.             x+=1;  
  38.             Paint mPaint = new Paint();  
  39.             mPaint.setColor(Color.BLUE);  
  40.             canvas.drawRect(x, 40, x+4080, mPaint);  
  41.         }  
  42.           
  43.     }  
  44. }  

在新线程里更新UI,可以直接postInvalidate()

Java代码  收藏代码
  1. public void onCreate(Bundle savedInstanceState) {      
  2.                super.onCreate(savedInstanceState);      
  3.                this.requestWindowFeature(Window.FEATURE_NO_TITLE);      
  4.      
  5.                myView = new MyView(this);  
  6.        this.setContentView(this.myView);      
  7.        new Thread(new myThread()).start();     
  8. }      
  9.     
  10.     class myThread implements Runnable {      
  11.           public void run() {     
  12.               while (!Thread.currentThread().isInterrupted()) {      
  13.                    try {  
  14.                           myView.postInvalidate();   
  15.                         Thread.sleep(100);       
  16.                    } catch (InterruptedException e) {      
  17.                         Thread.currentThread().interrupt();      
  18.                    }      
  19.                }      
  20.           }      
  21.     }  

抱歉!评论已关闭.