深入Android架构(从线程到AIDL)_15 应用Android的UI框架02

news/2025/1/11 14:32:01/

3、 使用UI线程的MQ(Message Queue)

// myView.java
// ………
public class myView extends View {// ………@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);// ………// canvas.drawRect(….);invalidate();}
}
  • 我们可以透过Message方式来触发UI线程去調用invalidate()函数,而达到重新执行onDraw()来进行重复绘图和刷新画面的动作。

       

// myView.java
//……..
public class myView extends View {private Paint paint= new Paint();private int line_x = 100, int line_y = 100;private float count = 0;private myHandler h;myView(Context ctx){ super(ctx);h = new myHandler();}@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);if( count > 12) count = 0;int x = (int) (75.0 * Math.cos(2*Math.PI * count/12.0));int y = (int) (75.0 * Math.sin(2*Math.PI * count/12.0));count++;canvas.drawColor(Color.WHITE);paint.setColor(Color.RED);paint.setStrokeWidth(3);canvas.drawLine(line_x, line_y, line_x+x, line_y+y, paint);paint.setStrokeWidth(2);paint.setColor(Color.BLUE);canvas.drawRect(line_x-5, line_y - 5, line_x+5, line_y + 5, paint);paint.setColor(Color.YELLOW);canvas.drawRect(line_x-3, line_y - 3, line_x+3, line_y + 3, paint);h.removeMessages(0);Message msg = h.obtainMessage(0);h.sendMessageDelayed(msg, 1000);}class myHandler extends Handler {@Override public void handleMessage(Message msg) {invalidate();}};
}
  • 使用sendMessageDelayed()函数来暂停一下,延迟数秒钟才传递 Message给UI线程。
     

 4、 诞生一个小线程担任游戏线程

  • 刚才是由UI线程来丢Message到自己的MQ里;也就是UI线程丢Message给自己。同一样地,也可以由其它线程来丢Message到UI线程的MQ里,来触发UI线程去調用invalidate()函数。
    // myView.java
    // ……….
    public class myView extends View {private Paint paint= new Paint();private int line_x = 100, line_y = 100;private float count = 0;private myHandler h;myView(Context ctx) { super(ctx); h = new myHandler(); }@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);if( count > 12) count = 0;int x = (int) (75.0 * Math.cos(2*Math.PI * count/12.0));int y = (int) (75.0 * Math.sin(2*Math.PI * count/12.0));count++;canvas.drawColor(Color.WHITE);paint.setColor(Color.RED);paint.setStrokeWidth(3);canvas.drawLine(line_x, line_y, line_x+x, line_y+y, paint);paint.setStrokeWidth(2);paint.setColor(Color.BLUE);canvas.drawRect(line_x-5, line_y - 5, line_x+5, line_y + 5, paint);paint.setColor(Color.MAGENTA);canvas.drawRect(line_x-3, line_y - 3, line_x+3, line_y + 3, paint);//--------------------------------myThread t = new myThread();t.start();}// 诞生一个小线程,担任游戏线程,负责回圈控制class myThread extends Thread{public void run() {h.removeMessages(0);Message msg = h.obtainMessage(0);h.sendMessageDelayed(msg, 1000);}};class myHandler extends Handler {@Override public void handleMessage(Message msg) {invalidate(); // call onDraw()}};
    }

  • UI线程诞生一个小线程,并且由该小线程去执行myThread类别里的run()函数。接着,这新线程执行到指令: 

            h.removeMessages(0);
            Message msg = h.obtainMessage(0);
            h.sendMessageDelayed(msg, 1000);

  • 延迟数秒钟才传递 Message给UI线程(丢入UI线程的MQ里)。
  • 当UI线程发现MQ有个Message,就去执行myHandler类别里的handleMessage()函数。就触发UI线程去調用invalidate()函数了。
     

5、 小线程(非UI线程)調用postInvalidate()

刚才的小线程传递Message给UI线程(丢入UI线程的MQ里),触发UI线程去調用invalidate()函数。 Android提供一个postInvalidate()函数来替代上述的动作。由小线程直接去調用postInvalidate()函数,就能间接触发UI线程去調用invalidate()函数了。

// myView.java
//……
public class myView extends View {//……….@Override protected void onDraw(Canvas canvas) {//…………..myThread t = new myThread();t.start();}class myThread extends Thread{public void run() {postInvalidateDelayed(1000);}};
}
  • 由小线程直接去調用postInvalidate()函数;就相当于,由小线程传递Message给UI线程,触发UI线程去調用invalidate()函数。


 


http://www.ppmy.cn/news/1562258.html

相关文章

MR30分布式 IO革新饮料灌装机产线

在当今竞争激烈的饮料生产行业,高效、精准的生产控制是企业立足市场、赢得发展的关键所在。而MR30分布式 IO 模块的应用,正为饮料灌装机产线带来了前所未有的高效控制新局面,推动着整个生产流程朝着更智能、更稳定的方向大步迈进。 精准数据采…

学前端 4 个月想进中厂,该怎么做?

大家好,我是程序员鱼皮。收到一位编程导航鱼友的提问,想要自学前端 4 个月进入中厂工作,让我帮忙给出一份学习计划。 鱼友提问 我刚刚考完研和准备期末考试,大三基本上在备研所以没有专门学习一项技术栈,简单学习过 …

基于Qt的OFD阅读器开发原理与实践

摘要 本文详细探讨了基于Qt开发OFD阅读器的原理与实践。通过解析OFD文件格式、构建文档结构、实现页面渲染、处理用户交互以及进行性能优化,本文展示了如何使用Qt框架开发一个功能强大、性能优异的OFD阅读器。文章还提供了示例代码和未来发展方向,为开发…

PyTorch:.max(1)和.max(0)的使用

目录 1).max(1)的使用: 2).max(0)的使用: 1).max(1)的使用: 假设有一个形状为 ( m , n ) 的 Tensor x ,其中m表示行数,n表示列数。 x.max(1) ,相当于x.max(dim1) 。作…

TypeScript语言的网络编程

TypeScript语言的网络编程 引言 在现代软件开发中,网络编程是一个不可或缺的部分。随着互联网的快速发展,网络应用程序越来越普遍,涉及到从简单的个人网站到复杂的企业级应用。TypeScript作为一种强类型的JavaScript超集,近年来…

【Unity-和WPF结合的优势】

数据处理深度和灵活性的局限 在 Unity 中: Unity 虽然可以处理数据,但它的数据处理能力主要侧重于游戏开发场景相关的数据。对于工业仿真软件中的复杂数据结构和深度业务逻辑处理相对有限。例如,在工业生产中可能涉及到大量的设备参数、工艺…

Bash语言的软件工程

Bash语言的软件工程 引言 在现代软件工程中,使用脚本语言来处理自动化任务、系统管理、数据处理等问题已经成为一种常见的做法。Bash(Bourne Again SHell)作为一种强大且广泛使用的命令行解释器,凭借其简洁性和强大功能&#xf…

ModbusTCP转CCLINKIE在机器人中的革命性应用!

在当今快速发展的机器人技术领域,实现不同通讯协议设备之间的高效互联变得尤为重要。其中,开疆智能MCCLINKIE转ModbusTCP网关KJ-MTCPZ-CCIES技术的应用,为机器人产品提供了更为灵活和高效的通信解决方案。我们需要理解什么是CCLINKIE转Modbus…