利用Handler来更新android的UI

原贴链接:http://rayleung.javaeye.com/blog/411860

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

Java代码
  1. newThread(newRunnable(){
  2. publicvoidrun(){
  3. myView.invalidate();
  4. }
  5. }).start();

然而发现这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。查阅了文档和apidemo后,发觉常用的方法是利用Handler来实现UI线程的更新的。

下面代码的功能很简单:画一个圆出来,每隔0.1秒,圆向10移动10个像素。但可以清楚展示利用Handler更新UI的流程。

首先创建简单的View,代码如下:

Java代码
  1. packagecom.ray.handler;
  2. importandroid.content.Context;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.Color;
  5. importandroid.graphics.Paint;
  6. importandroid.graphics.Point;
  7. importandroid.graphics.drawable.Drawable;
  8. importandroid.view.View;
  9. publicclassBounceViewextendsView{
  10. floatx=40;
  11. publicBounceView(Contextcontext){
  12. super(context);
  13. }
  14. @Override
  15. protectedvoidonDraw(Canvascanvas){
  16. x+=10;
  17. PaintmPaint=newPaint();
  18. mPaint.setAntiAlias(true);
  19. mPaint.setColor(Color.GREEN);
  20. canvas.drawCircle(x,40,40,mPaint);
  21. }
  22. }

创建Activity,代码如下:

Java代码
  1. packagecom.ray.handler;
  2. importandroid.app.Activity;
  3. importandroid.content.Context;
  4. importandroid.graphics.Canvas;
  5. importandroid.graphics.Color;
  6. importandroid.graphics.Paint;
  7. importandroid.os.Bundle;
  8. importandroid.os.Handler;
  9. importandroid.os.Message;
  10. importandroid.view.View;
  11. importandroid.view.Window;
  12. publicclassTestHandlerextendsActivity{
  13. protectedstaticfinalintGUIUPDATEIDENTIFIER=0x101;
  14. ThreadmyRefreshThread=null;
  15. BounceViewmyBounceView=null;
  16. HandlermyHandler=newHandler(){
  17. publicvoidhandleMessage(Messagemsg){
  18. switch(msg.what){
  19. caseTestHandler.GUIUPDATEIDENTIFIER:
  20. myBounceView.invalidate();
  21. break;
  22. }
  23. super.handleMessage(msg);
  24. }
  25. };
  26. publicvoidonCreate(BundlesavedInstanceState){
  27. super.onCreate(savedInstanceState);
  28. this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  29. this.myBounceView=newBounceView(this);
  30. this.setContentView(this.myBounceView);
  31. newThread(newmyThread()).start();
  32. }
  33. classmyThreadimplementsRunnable{
  34. publicvoidrun(){
  35. while(!Thread.currentThread().isInterrupted()){
  36. Messagemessage=newMessage();
  37. message.what=TestHandler.GUIUPDATEIDENTIFIER;
  38. TestHandler.this.myHandler.sendMessage(message);
  39. try{
  40. Thread.sleep(100);
  41. }catch(InterruptedExceptione){
  42. Thread.currentThread().interrupt();
  43. }
  44. }
  45. }
  46. }
  47. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值