`

利用Handler更新Android UI的另一种方法

阅读更多

文字程序很简单,一个View,一个Activity,利用handler和postInvalidate()更新UI。

程序效果是一个蓝色的正方形向右移出屏幕。

package com.ray.test;

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);
        mHandler = new Handler();
        mHandler.post(update);
        setContentView(myView);
    }
    
    private Runnable update = new Runnable() {
        public void run() {
            myView.update();
            mHandler.postDelayed(update, 5);
        }
    };
    
    class MyView extends View{
    	
    	private float x = 0f;
		public MyView(Context context) {
			super(context);
			
		}
		
		public void update(){
			postInvalidate();
		}
		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);
		}
    	
    }
}

 之前还写过另外一篇关于Handler更新UI的文章:

http://rayleung.iteye.com/blog/411860

分享到:
评论
2 楼 raymondlueng 2009-08-04  
非常感谢您指出我理解上的错误,谢谢!我会继续努力的!
1 楼 daytodayme 2009-08-04  
你的两篇文章对于invalidate()和postInvalidate()认识有些问题
http://www.iteye.com/topic/435147
http://rayleung.iteye.com/blog/411860

调用Handler.post(Runnable r)方法,Runnable运行在UI所在线程,所以可以直接调用View.invalidate()
package com.ray.test;

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);
        mHandler = new Handler();
        mHandler.post(new Runnable(){
			@Override
			public void run() {
				myView.invalidate();
				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,可以直接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 {
	                	      myView.postInvalidate(); 
	                        Thread.sleep(100);     
	                   } catch (InterruptedException e) {    
	                        Thread.currentThread().interrupt();    
	                   }    
	               }    
	          }    
     } 

相关推荐

    子线程中更新UI线程的三种方法

    另一种常见的方式是在子线程中创建一个Runnable对象,然后在主线程中调用Activity的runOnUiThread()方法来执行这个Runnable。runOnUiThread()会确保Runnable中的代码在UI线程中运行,所以可以直接进行UI更新。这种...

    android开发教程之handler异步更新ui

    另一个使用`postInvalidate()`的例子是在子线程中更新UI: ```java new Thread(new myThread()).start(); class myThread implements Runnable { public void run() { while (!Thread.currentThread()....

    android 多线程 下载 更新 ui 例子

    2. **AsyncTask**:另一种常见的实现方式是使用AsyncTask,它是一个轻量级的异步任务类,特别适合于短时间的后台操作和UI更新。不过,由于AsyncTask的限制(如任务数量限制),在处理大量或持续的后台任务时,它可能...

    android 实例 Activity 之间通过 Handler 通信

    首先,创建一个Handler实例,并重写handleMessage()方法,这里会处理从另一个Activity发送过来的消息。例如: ```java public class SenderActivity extends AppCompatActivity { private Handler mHandler = new ...

    Android中AsyncTask与handler用法实例分析

    **Handler** 和 **Message** 机制是另一种异步处理方式,适用于更复杂的异步通信场景。Handler通常在UI线程中创建,用于接收和处理由其他线程发送的消息。Message对象用于承载数据,而Handler的`sendMessage()`和`...

    Android HandlerDemo

    就是另一个线程发送一个编号给消息所在的线程,那么该线程的消息处理程序就会收到该消息并进行处理,而消息采用int类型,所以int能够表示多少种数字就以为着有多少消息可以给你使用。这里是一个简单的HandlerDemo。

    Android 实现界面刷新的几种方法

    `postInvalidate()`方法是另一种在非UI线程中刷新界面的方式。它会把刷新任务放入UI线程的消息队列,待UI线程空闲时执行。这种方法比Handler更简洁,因为不需要创建额外的Message对象和处理逻辑。下面是一个使用`...

    在一个Activity中更新操作另一个Activity的内容

    如果两个Activity共享同一个Handler,那么一个Activity可以通过发送消息给Handler,由Handler在正确的线程(通常是主线程)中执行更新UI的操作,从而达到间接修改另一个Activity内容的目的。但是,这种做法并不常见...

    安卓UI线程机制 ,在子线程中访问UI

    3. 使用runOnUiThread():另一种方式是在子线程中调用Activity的runOnUiThread()方法。这个方法会把传入的Runnable放到主线程的事件队列中,确保在主线程中执行。 4. 使用AsyncTask:AsyncTask是Android提供的一种...

    Android 中级应用 handler 之二 初试handler

    `AsyncTask`是另一种异步处理方式,但它内部也使用了`Handler`。 6. **Handler的内存泄漏问题** 不当使用`Handler`可能导致内存泄漏,尤其是当Activity与`Handler`之间的引用没有正确断开时。为防止这种情况,可以...

    Handler与AsyncTask使用示例

    `Looper`是Android消息系统的另一个核心组件,它在一个线程中运行一个无限循环,不断地从消息队列中取出消息并分发给相应的`Handler`进行处理。默认情况下,Android主线程(UI线程)已经有一个`Looper`在运行,而在...

    Android Handler机制解析

    Android Handler机制是Android系统中的一种机制,用于处理线程之间的通信和消息传递。在Android系统中,Handler机制是基于Java的线程机制来实现的。下面将对Android Handler机制进行详细的解析。 一、线程概念 在...

    android handler

    在Android开发中,**Handler**是一种非常重要的消息处理机制,主要用于解决线程间通信的问题。它使得开发者可以在一个线程中发送消息或运行任务,并在另一个线程中处理这些消息或任务。这种机制非常适合用于执行耗时...

    Android异步更新UI的四种方式

    这是另一种直接在UI线程执行代码的方式。在后台线程中调用runOnUiThread,传入一个Runnable对象,该对象的run方法将在主线程中执行。这种方法简洁明了,适合快速实现简单的UI更新。例如,可以在后台线程中调用...

    AsyncTask 与Thread加Handler处理消息比较

    另一方面,`Thread`配合`Handler`是一种更底层的异步处理方式。开发者需要手动创建`Thread`,并在其中执行耗时操作。当需要更新UI时,通过`Handler`发送一个Message或者Runnable到主线程的消息队列。这种方式更加...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    另一种策略是通过`postDelayed()`方法来避免Handler持有Activity的强引用。通过在`Runnable`对象中处理UI更新,当任务执行完毕后,`Runnable`对象可以被垃圾回收,因为此时它不再有任何引用。例如: ```java ...

    旋转UI等待界面

    6. **Handler和Message**:另一种处理异步操作的方法是使用Handler和Message。在后台线程执行任务,然后通过发送Message到主线程的Handler来更新UI,同时显示或隐藏等待界面。 7. **LiveData and ViewModel**:在...

    Android的消息处理机制--Looper,Handler

    `Callback`接口提供了另一种处理消息的方式,用户可以通过实现这个接口来自定义消息处理逻辑。 `Handler`发送消息使用`sendMessage`或`post`等方法,接收消息则由`Looper`调度,`Handler`的`dispatchMessage`方法将...

    Android UI-最新版糗事百科布局,带简单数据加载

    另一种可能是使用云数据库如Firebase Realtime Database或Firestore。 6. **Android UI设计原则**:开发者需要遵循Material Design指南,这是Google为Android设计的一套系统,包括颜色、图标、动画和交互等方面的...

    034_android_UI组件之 ProgressDialog 和Message

    Message,另一方面,是Android Handler机制中的一个重要组成部分。Handler主要用于线程间通信,尤其是主线程(UI线程)与其他工作线程之间的通信。在Android中,主线程负责处理所有的UI更新,因此当需要在后台线程...

Global site tag (gtag.js) - Google Analytics