刚刚开始接触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. }
  • TestHandler.rar(111.8 KB)
  • 下载次数: 1402

更多相关文章

  1. Android(安卓)startActivityForResult的使用
  2. Android(安卓)代码质量工具集成与应用
  3. android Java代码的启动
  4. android 解析json数据格式
  5. Android(安卓)获取系统相册中的所有图片
  6. android弹出对话框
  7. Android清除本地数据缓存代码
  8. Android使用ListView使用
  9. Android(安卓)TabHost使用、动态加载内容

随机推荐

  1. CentOS下实现Flask + Virtualenv + uWSGI
  2. PySide-QtWebKit: CSS font-family没有效
  3. python学习笔记10(函数一): 函数使用、调用
  4. python爬取csdn的博客内容
  5. 利用python Pandas进行数据预处理
  6. python 带正则的search 模块
  7. Python基础1--数据类型
  8. 第四章 Python 对象
  9. python调用shell命令之三慷慨法
  10. ML笔记之choosing right estimator——有