package com.example.testanimation;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.format.Time;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {
private Paint paint;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public MyView(Context context) {
super(context);
paint = new Paint();
paint.setColor(Color.RED);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
postInvalidate();
}
}
}).start();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText(System.currentTimeMillis() + " ", 100, 100, paint);
}
}
Android中在绘图中的多线程中,invalidate和postInvalidate这两个方法是用来刷新界面的,调用这两个方法后,会调用onDraw事件,让界面重绘。
书上提到invalidate不能直接在线程中调用,这里的线程是指的子线程(非UI线程)吧?因为在非UI线程中调用invalidate会导致线程不安全,也就是说可能在非UI线程中刷新界面的时候,UI线程(或者其他非UI线程)也在刷新界面,这样就导致多个界面刷新的操作不能同步,导致线程不安全
在非UI线程中我们可以使用Handler类来发送消息到UI线程队列中,由UI线程来负责安排刷新界面。这是线程安全的。
如果要在非UI线程中刷新界面,需要用到postInvalidate,使用这个方法不用Handler来接收消息,能直接刷新