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();     
}     
}     
}     
}

时间: 2024-11-01 02:01:40

Handler更新UI的几种方法的相关文章

android更新UI的几种方法

作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了, 因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现, 自己越来越消极怠工,只是在无意义的敲代码,敲的还是网上抄来的代码,如果不行,继续找. 这就 是项目进度没有规划好而导致的. 最近在做有关蓝牙的项目,一开始的进度都安排得很顺利,但是因 为测试需要两部手机,而且还要是android手机,暑假已经开始了,同学们都回家了,加上我手机的蓝牙坏了 ,导致我的进度严重

Android更新UI的四种方法详解_Android

前言 相信每位Android开发者们都知道更新UI只能在主线程中进行,若是在子线程执行任务后需要更新UI,则需要借助handler跳转到主线程中.以下介绍几种操作UI的方法. 一.使用Handler的handleMessage() Handler的构造 public Handler() { this(null, false); } public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { fina

详解android异步更新UI的几种方法

前言 我们知道在Android开发中不能在非ui线程中更新ui,但是,有的时候我们需要在代码中执行一些诸如访问网络.查询数据库等耗时操作,为了不阻塞ui线程,我们时常会开启一个新的线程(工作线程)来执行这些耗时操作,然后我们可能需要将查询到的数据渲染到ui组件上,那么这个时候我们就需要考虑异步更新ui的问题了. android中有下列几种异步更新ui的解决办法: Activity.runOnUiThread(Runnable) View.post(Runnable) long) View.pos

Android开发之子线程操作UI的几种方法_Android

 在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 方法1 Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行.如

Android开发之子线程操作UI的几种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 方法1 Activity.runOnUiThread 方法如下: runOnUiThread(new Runnable() { @Override public void run() { tv.setText("Hello"); } }); 这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行.如果

更新ui-求指点,Handler更新UI线程问题

问题描述 求指点,Handler更新UI线程问题 public Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case 0x123: one.setImageResource(imageIds[currentIm

activity-使用 Handler 更新 UI

问题描述 使用 Handler 更新 UI 我实现了一个Android应用程序,,包含四个activity(A,B,C,D) A 调用 B; B调用 C,并且 C调用 D. Activity A 实现了一个Handler Handler handler=new Handler(){ public void handleMessage(Message msg){ Bundle bundle = new Bundle(); bundle = msg.getData(); String key = b

Android异步更新UI的四种方式_Android

大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,大致有4种方式,下面分别使用四种方式来更新一个TextView.1.使用Handler消息传递机制 package com.example.runonuithreadtest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView;

Android 更新UI的几种方式

1.Activity的 runOnUiThread    textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { textView.setText( "更新UI了"); } }); } }).start(); an