【问题标题】:Drawing on canvas with separate thread Android使用单独的线程 Android 在画布上绘图
【发布时间】:2017-09-16 14:42:28
【问题描述】:

您好,我正在尝试使用 SurfaceView 和 Threads 以便在 Canvas 上更快地绘制。到目前为止,我已经通过简单地扩展 View 类并在 onDraw 方法中绘制来完成在画布上绘图。此外,如果用户通过键盘进行输入(通过将键码从活动传递到自定义视图),我可以重绘画布。

问题是我被多线程困住了,我用 SurfaceView 替换了 View 类并实现了 Runnable(遵循this 教程)。但如果发生键输入,我无法传递键码。此外,如果我在自定义视图上调用 invalidate() 方法,则不会发生任何事情。与教程代码和我的唯一区别是我在 while 循环的末尾添加了这一行:

retry = false;

为了在绘图后停止执行线程。并在每次点击活动后添加此行,以便我可以重新绘制所有内容。

view.resume();

问题: -view 不会在关键事件上失效,也不会绘制新图像(不知道为什么)

  • 如果我通过调用 thread.join() 来停止线程;方法,CustomView中的其他对象会留在堆内存中还是会被销毁?

  • 如何让这个应用在启动时自动执行,之后只在点击时执行?

  • 如果我在 view.resume() 之前显式调用,为什么 invalidate 方法不会清除画布?

附言我需要发布代码示例,请告诉我,我会将 git repo 与测试应用程序一起附加。

谢谢

【问题讨论】:

    标签: android multithreading canvas


    【解决方案1】:

    在 android 中,你有一个 Handler 类,你可以实现它来发送消息,你在你想要接收和实现 handleMessage 的线程内创建它,在你使用 sendMessage 的其他线程上。

    另外,对于布尔标志和多线程,您应该使用关键字 volatile 来进行一些 VM 优化。

    volatile boolean retry = false;
    

    【讨论】:

    • 我添加了 volatile 关键字,但没有任何改变。谢谢
    猜你喜欢
    • 2012-06-27
    • 2012-10-05
    • 1970-01-01
    • 2014-03-29
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多