Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:AndroidUI操作并不是线程安全的,并且这些操作必须在UI线程中调用。

  Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。

1,利用invalidate()刷新界面
  实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。

//onCreate()中开启线程


newThread(newGameThread()).start();

//实例化一个handler

HandlermyHandler=newHandler(){
//接收到消息后处理
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseActivity01.REFRESH:
mGameView.invalidate();//刷新界面
break;
}

super.handleMessage(msg);
}
};

classGameThreadimplementsRunnable{
publicvoidrun(){
while(!Thread.currentThread().isInterrupted()){
Messagemessage=newMessage();
message.what=Activity01.REFRESH;
//发送消息
Activity01.this.myHandler.sendMessage(message);
try{
Thread.sleep(100);
}catch(InterruptedExceptione){
Thread.currentThread().interrupt();
}
}
}

}

2,使用postInvalidate()刷新界面
使用postInvalidate则比较简单,不需要handler,直接在线程中调用postInvalidate即可。

classGameThreadimplementsRunnable{
publicvoidrun(){
while(!Thread.currentThread().isInterrupted()){
try{
Thread.sleep(100);
}catch(InterruptedExceptione){
Thread.currentThread().interrupt();
}

//使用postInvalidate可以直接在线程中更新界面
mGameView.postInvalidate();
}
}
}

View类中postInvalidate()方法源码如下,可见它也是用到了handler的:

publicvoidpostInvalidate(){

postInvalidateDelayed(0);

}

publicvoidpostInvalidateDelayed(longdelayMilliseconds){

//WetryonlywiththeAttachInfobecausethere'snopointininvalidating

//ifwearenotattachedtoourwindow

if(mAttachInfo!=null){

Messagemsg=Message.obtain();

msg.what=AttachInfo.INVALIDATE_MSG;

msg.obj=this;

mAttachInfo.mHandler.sendMessageDelayed(msg,delayMilliseconds);

}

}




除了onCreate()是运行在UI线程上的,其实其他大部分方法都是运行在UI线程上的,其实其实只要你没有开启新的线程,你的代码基本上都运行在UI线程上。


更多相关文章

  1. Android(安卓)Handler机制详解:在线程中新建Handler
  2. Android异步处理
  3. [转] 有关Android线程的学习
  4. Android异步处理系列文章索引
  5. android UI更新问题 Thread和Looper以及Handler和Message详解 An
  6. Handler与异步消息处理
  7. Android(安卓)开发艺术探索读书笔记 10 -- Android(安卓)的消息
  8. Android事件总线(一)EventBus3.0用法全解析
  9. android 在android中教你一行代码判断是不是主线程

随机推荐

  1. android Service onStartCommand intent
  2. Android初级教程人品计算器
  3. Android保持屏幕常亮的方法
  4. android
  5. js判断运行平台
  6. android播放音乐文件代码
  7. android 播放音频和视频
  8. Android完全退出应用程序
  9. Android调用RESTful WCF服务
  10. Android获取剪贴板内容