Android单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中执行。不能直接在工作线程更新UI。


自定义一个VIew:

package com.example.updateui;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.view.View;public class MyView extends View{private static final String TAG = MyView.class.getSimpleName();private int mCount = 0;public MyView(Context context){super(context);// TODO Auto-generated constructor stub}public MyView(Context context,AttributeSet attrSet){super(context,attrSet);// TODO Auto-generated constructor stub}@Overridepublic void onDraw(Canvas canvas){Log.i(TAG,"onDraw");if (mCount < 100){mCount++;}else{mCount = 0;}// 绘图Paint paint = new Paint();switch (mCount % 4){case 0:paint.setColor(Color.BLACK);break;case 1:paint.setColor(Color.RED);break;case 2:paint.setColor(Color.BLUE);break;case 3:paint.setColor(Color.YELLOW);break;}// 绘图canvas.drawRect(this.getLeft(), this.getTop(), this.getRight(),this.getBottom(), paint);Log.i(TAG,"drawRect count:"+mCount);}}

主代码:


package com.example.updateui;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.Menu;import android.view.Window;public class MainActivity extends Activity{private MyView mView;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);mView = new MyView(this);setContentView(mView);//需要绑定到window,invalidate有效new Thread(new Runnable(){@Overridepublic void run(){// TODO Auto-generated method stubwhile (!Thread.currentThread().isInterrupted()){//发送消息到Handler(Handler包含了主UI线程的looper和消息队列)Message message = new Message();message.what = 1;MainActivity.this.mHandler.sendMessage(message);try{Thread.sleep(1000);}catch (InterruptedException e){Thread.currentThread().interrupt();}}}}).start();// setContentView(R.layout.activity_main);}//注册一个Handler接收消息private Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg){switch (msg.what){case 1:mView.invalidate();//直接刷新UI,只能在UI线程调用invalidatebreak;}super.handleMessage(msg);}};@Overridepublic boolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.activity_main, menu);return true;}}



更多相关文章

  1. js代码
  2. android thread Interrupte使用方法
  3. Android动作广播类别消息类型
  4. Android客户端发送邮件
  5. Android(安卓)线程 Handler详解
  6. 在Android中使用ExecutorService、Executors、Feature
  7. Edittext 取消长按 复制和粘糊等操作
  8. Android故障积累----(1/N)
  9. 监听方法Android之Home键监听封装

随机推荐

  1. Android(安卓)EditText 设置键盘 搜索,回
  2. Android之Glide(非常好用的图片加载框架)
  3. Android通过Socket(TCP/IP)与PC通讯
  4. cocos2d-x iOS和Android同步开发 手机设
  5. 环境装好后,创建手机的模拟器
  6. 解析Android的 消息传递机制Handler
  7. 转!Android onTouchEvent,onClick和onLong
  8. Android(安卓)Binder 修炼之道(三)Binder
  9. Android 开发艺术探索读书笔记 11 -- And
  10. Android6.0新特性之DozeMode