android View 重绘机制
16lz
2021-12-04
android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。
以下是我在android文档中找到的说明,
引用
public void invalidate()
Invalidate the whole view. If the view is visible, onDraw(Canvas) will be called at some point in the future. This must be called from a UI thread. To call from a non-UI thread, call postInvalidate().
public void postInvalidate ()
Cause an invalidate to happen on a subsequent cycle through the event loop. Use this to invalidate the View from a non-UI thread.
google的文档的说明实在是简单,往往看了开发中都会遇到这两个问题:
1. 没有任何异常,view没能刷新。
2. android应用异常终止,打开logcat会看到这样的异常信息, Only the original thread that created a view hierarchy can touch its views。
最后,通过查文档,上网查询才知道,invalidate和postInvalidate方法需要使用android提供的handler,才能实现重绘,而在文档的说明中却只字不提,真是简单啊。具体是在需要重绘的地方调用handler的sendMessage方法发送消息,紧接着会os会触发handler中的handlerMessage方法,在handlerMessage方法中再调用view的invalidate或者postInvalidate方法就能实现重绘。
下面是我分别针对invalidate方法,给出view重绘代码,仅供参考:
Java代码
或者这样实现也可以。
Java代码
以下是我在android文档中找到的说明,
引用
public void invalidate()
Invalidate the whole view. If the view is visible, onDraw(Canvas) will be called at some point in the future. This must be called from a UI thread. To call from a non-UI thread, call postInvalidate().
public void postInvalidate ()
Cause an invalidate to happen on a subsequent cycle through the event loop. Use this to invalidate the View from a non-UI thread.
google的文档的说明实在是简单,往往看了开发中都会遇到这两个问题:
1. 没有任何异常,view没能刷新。
2. android应用异常终止,打开logcat会看到这样的异常信息, Only the original thread that created a view hierarchy can touch its views。
最后,通过查文档,上网查询才知道,invalidate和postInvalidate方法需要使用android提供的handler,才能实现重绘,而在文档的说明中却只字不提,真是简单啊。具体是在需要重绘的地方调用handler的sendMessage方法发送消息,紧接着会os会触发handler中的handlerMessage方法,在handlerMessage方法中再调用view的invalidate或者postInvalidate方法就能实现重绘。
下面是我分别针对invalidate方法,给出view重绘代码,仅供参考:
Java代码
- class CustomizeView extends WhichView {
- public CustomizeView(Context context) {
- super(context);
- final Handler handler = new Handler();
- new Thread(new Runnable() {
- @Override
- public void run() {
- // delay some minutes you desire.
- /*try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- }*/
- handler.post(new Runnable() {
- public void run() {
- concreteUpdateUI();
- invalidate();
- }
- });
- }
- }).start();
- }
- protected void concreteUpdateUI() {
- // Add concrete movement for UI updates.
- // ...
- }
- }
或者这样实现也可以。
Java代码
- class CustomizeView extends TextView {
- public CustomizeView(Context context) {
- super(context);
- new Thread(new UIUpdateThread()).start();
- }
- class UIUpdateThread implements Runnable {
- final Handler mHandler = new Handler();
- final Runnable mUpdateResults = new Runnable() {
- public void run() {
- concreteUpdateUI();
- invalidate();
- }
- };
- public void run() {
- // delay some minutes you desire.
- /*try {
- Thread.sleep(1000 * 5);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }*/
- mHandler.post(mUpdateResults);
- }
- }
- protected void concreteUpdateUI() {
- // Add concrete movement for UI updates.
- // ...
- }
- }
更多相关文章
- Android(安卓)解决setRequestedOrientation之后手机屏幕的旋转不
- 详解 Android(安卓)的 Activity 组件
- Android(安卓)GPS架构分析
- android流式布局热门标签的实现
- android progressDialog的使用
- 详解Android中的Activity生命周期
- Android中设置定时器
- Android(安卓)之 SystemService
- Android之UI学习篇七:ImageView实现适屏和裁剪图片的功能