利用Handler来更新android的UI(1)

刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题

new Thread( new Runnable() {
public void run() {
myView.invalidate();
}
}).start();


然而发现这样是不行的,因为它违背了单线程模型:
Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。查阅了文档和apidemo后,发觉常用的方法是利用Handler来实现UI线程的更新的。
下面代码的功能很简单:画一个圆出来,每隔0.1秒,圆向10移动10个像素。但可以清楚展示利用Handler更新UI的流程。


首先创建简单的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() {
public void handleMessage(Message msg) {
switch (msg.what) {
case TestHandler.GUIUPDATEIDENTIFIER:
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()) {

Message message = new Message();
message.what = TestHandler.GUIUPDATEIDENTIFIER;

TestHandler.this.myHandler.sendMessage(message);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
}

更多相关文章

  1. Android Wi-Fi基本操作
  2. Android中线程同步之Mutex与Condtion的用法
  3. apk安装法之二----一段Android实现应用下载并自动安装apk包的代
  4. android 计时器线程
  5. Android SQLite是线程安全的吗?
  6. Android 通知的基本用法示例代码
  7. Android使用代码实现RelativeLayout,LinearLayout布局
  8. Android 从代码中打开淘宝和亚马逊、facebook、Message
  9. 修改dialog背景以及代码扩展AlertDialog和tint的使用

随机推荐

  1. Android(安卓)mk如何使用第三方jar
  2. android常用代码
  3. Android中各种消息监听机制
  4. android 圆形的图片里面带字
  5. android service
  6. android滑轮选择控件——whell
  7. Android获取文件的MD5值
  8. 获取android build-tools/platform-tools
  9. 限制Android的EditText输入文字时换行
  10. Android(安卓)O 为应用添加默认权限,进入