Handler更新UI的几种方法

简介:

handler使用Message

1.定义一个Handler

2.重写消息处理函数

3.发送消息

//创建简单的View
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.graphics.drawable.Drawable; 
import android.view.View; 

public class BounceView extends View { 
float x = 40; 

public BounceView(Context context) {  
super(context);  
}  

@Override  
protected void onDraw(Canvas canvas) {  
x+=10; 
Paint mPaint = new Paint(); 
mPaint.setAntiAlias(true); 
mPaint.setColor(Color.GREEN); 
canvas.drawCircle(x, 40, 40, mPaint); 

//创建Activity
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.Window; 

public class TestHandler extends Activity { 
protected static final int GUIUPDATEIDENTIFIER = 0x101;  

Thread myRefreshThread = null;  
BounceView myBounceView = null;  
//1.定义一个Handler(一般更新View)
Handler myHandler = new Handler() { 
//2.重写消息处理函数
public void handleMessage(Message msg) {  
switch (msg.what) {  
//判断发送的消息
case TestHandler.GUIUPDATEIDENTIFIER:  
//更新View
myBounceView.invalidate(); 
break;  
}  
super.handleMessage(msg);  
}  
}; 
public void onCreate(Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
this.requestWindowFeature(Window.FEATURE_NO_TITLE);  

this.myBounceView = new BounceView(this); 
this.setContentView(this.myBounceView);  
new Thread(new myThread()).start(); 
}  

class myThread implements Runnable {  
public void run() { 
while (!Thread.currentThread().isInterrupted()) {   
//3.发送消息
Message message = new Message();
//发送消息与处理函数里一致 
message.what = TestHandler.GUIUPDATEIDENTIFIER;  
//内部类调用外部类的变量
TestHandler.this.myHandler.sendMessage(message); 

try {  
Thread.sleep(100);   
} catch (InterruptedException e) {  
Thread.currentThread().interrupt();  
}  
}  
}  
}  

利用handler.post()更新UI

1.创建一个Handler 2.调用Handler.post(Runnable r)方法 3.Runnable运行在UI所在线程,所以可以直接调用View.invalidate()

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 

public class TestHandler extends Activity { 
private MyView myView; 
private Handler mHandler; 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
myView = new MyView(this); 
//创建一个Handler
mHandler = new Handler();
//调用Handler.post(Runnable r)方法
mHandler.post(new Runnable(){ 
@Override 
public void run() { 
//直接调用View.invalidate(),更新组件
myView.invalidate(); 
//延迟5毫秒后执行线程
mHandler.postDelayed(this, 5); 

}); 
setContentView(myView); 

class MyView extends View{ 
private float x = 0f; 
public MyView(Context context) { 
super(context); 


protected void onDraw(Canvas canvas) { 
super.onDraw(canvas); 
x+=1; 
Paint mPaint = new Paint(); 
mPaint.setColor(Color.BLUE); 
canvas.drawRect(x, 40, x+40, 80, mPaint); 


在线程里直接更新UI

//在新线程里更新UI,可以直接使用postInvalidate()

public void onCreate(Bundle savedInstanceState) {     
super.onCreate(savedInstanceState);     
this.requestWindowFeature(Window.FEATURE_NO_TITLE);     

myView = new MyView(this); 
this.setContentView(this.myView);     
new Thread(new myThread()).start();    
}     

class myThread implements Runnable {     
public void run() {    
while (!Thread.currentThread().isInterrupted()) {     
try { 
//更新UI
myView.postInvalidate();  
Thread.sleep(100);      
} catch (InterruptedException e) {     
Thread.currentThread().interrupt();     
}     
}     
}     
}

相关文章
|
算法 API C++
【Qt UI】QT 窗口/控件置顶方法详解
【Qt UI】QT 窗口/控件置顶方法详解
1106 0
|
8月前
|
存储 JSON JavaScript
WEB CAD插件通过上下文对象MxPluginContext修改UI界面的方法
本文介绍了如何使用MxPluginContext动态控制MxCAD项目的UI界面。通过该上下文对象,开发者可以灵活设置UI配置,如控制操作栏显隐、编辑按钮、添加侧边栏等。具体方法包括调用`getUiConfig()`获取并修改`mxUiConfig.json`中的属性,实现界面的定制化。此外,还提供了控制命令行聚焦的功能,解决输入框焦点锁定问题。详细代码示例和效果对比图展示了具体实现步骤,帮助开发者更好地适配项目需求。
|
存储 开发框架 JavaScript
深入探讨Flutter中动态UI构建的原理、方法以及数据驱动视图的实现技巧
【6月更文挑战第11天】Flutter是高效的跨平台移动开发框架,以其热重载、高性能渲染和丰富组件库著称。本文探讨了Flutter中动态UI构建原理与数据驱动视图的实现。动态UI基于Widget树模型,状态变化触发UI更新。状态管理是关键,Flutter提供StatefulWidget、Provider、Redux等方式。使用ListView等可滚动组件和StreamBuilder等流式组件实现数据驱动视图的自动更新。响应式布局确保UI在不同设备上的适应性。Flutter为开发者构建动态、用户友好的界面提供了强大支持。
236 2
|
机器人 Windows
RPA.UI.Win32.InputText方法
RPA.UI.Win32.InputText方法
129 1
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
JSON JavaScript 前端开发
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
1594 0
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
|
小程序
【微信小程序6】引入第三方UI的方法(ColorUi)
【微信小程序6】引入第三方UI的方法(ColorUi)
1143 0
|
前端开发
element-ui图标偶现乱码问题的原因和修复方法
之前很老的一个 webpack3 前端项目,用 vue-cli5 重构了一下,根据 vue-cli 文档安装的 sass 版本 ^1.32.7,sass-loader 版本 ^12.0.0,各种自测感觉没问题了就部署到线上了
|
JavaScript
element-ui(vue)upload组件的http-request方法的使用
element-ui(vue)upload组件的http-request方法的使用
623 0
element-ui的upload组件的clearFiles方法的调用
element-ui的upload组件的clearFiles方法的调用
704 0