View 使用线程实现canvas 内动态绘图 postInvalidate()

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来接收消息,能直接刷新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值