如何利用Handler更新androidUI

提出问题

新手刚开始接触android线程编程的时候,会想到如下使用如下代码:

new Thread( new Runnable() {

public void run() {

myView.invalidate();

}

}).start();

但是:该实现方法是不可行的。

分析问题:

因为:Android UI操作并不是线程安全的,这些操作必须在UI线程中执行

1.myView.invalidate()UI操作;

2.new Thread创建了一个新的线程,是一个子线程,而不是UI线程,在这个新的线程里面对view进行刷新,这样是不安全的。

解决问题:

那么如何解决这个问题呢?

答案:使用Handler来实现UI线程的更新的。

实现步骤:

1.view类里面定义一个Handler变量,这并没有开启一个新的线程,因此在handler里面更新本view是安全的;

2.然后我们创建一个线程,通过这个线程来给activityhandler变量发送消息,同时通过这个线程进行延时。

意即:

1Handler接收消息和处理消息;

2.创建一个线程,来给Handler发送消息;

消息处理三部曲:

1.发送消息;

2.接收消息;

3.处理消息;

代码参考

首先创建简单的View,代码如下:

package com.ray.handler;

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类,代码如下:

package com.ray.handler;

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;

Handler myHandler = new Handler() {//在主线程中创建Handler对象

public void handleMessage(Message msg) {//处理消息

switch (msg.what) {

case TestHandler.GUIUPDATEIDENTIFIER://

myBounceView.invalidate();//UI界面更新

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()) {

Message message = new Message();

message.what = TestHandler.GUIUPDATEIDENTIFIER;

TestHandler.this.myHandler.sendMessage(message); //发送一次消息,自动调用上面handler类的handleMessage函数,从而更新view类。

try {

Thread.sleep(100); //延时

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

}

}

}

}

更多相关文章

  1. Android Studio中同步代码时报:Received status code 400 from se
  2. Android 消息处理机制1(从源码分析)
  3. Android中Toast如何在子线程中调用
  4. 多线程例子 android camera capture
  5. Android学习笔记(7)————Android中的消息机制
  6. android 子线程handler 实现
  7. android java代码覆盖率

随机推荐

  1. Android(安卓)8、Android(安卓)9获取手机
  2. Android之发送短信和接收验证码
  3. 详解Android中的屏幕方向
  4. android应用去掉title bar 及全屏处理方
  5. android关机充电流程、充电画面显示
  6. Kernel.org hacked – how to get Androi
  7. Android(安卓)Library Project 使用问题
  8. 解析Android消息处理机制:Handler/Thread/
  9. Android(安卓)开发环境配置
  10. 详解Android中的屏幕方向