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

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

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

下面代码的功能很简单:画一个圆出来,每隔0.1秒,圆向右移动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. }

更多相关文章

  1. android中判断网络和WIFI是否连接
  2. Android(安卓)Bundle类
  3. Android代码混淆官方实现方法
  4. material design 的android开源代码整理
  5. Android(安卓)Asynchronous Http Client 中文手册 1.4.6
  6. [置顶] [Android] AsyncTask使用实例---加载网络图片
  7. Android百分比布局支持库
  8. Android(安卓)Studio代码混淆,开启Proguard,稍微总结一下
  9. android image加载中等待动画

随机推荐

  1. Android设置系统时间
  2. Android(安卓)debuggerd
  3. Talking about Android(安卓)Process
  4. Android(安卓)View源码解析
  5. android的单选框例子
  6. Android(安卓)Studio 生成UML类图
  7. android 自定义具有反弹效果的ScrollView
  8. Android使用wifi Ap核心类
  9. Android(安卓)webview加载网页
  10. Android(安卓)Exception异常汇集【不定时