我的应用程序中有一个Canvas对象,我想每20毫秒更新一次。我尝试了Java的TimerTask,但它在几次更新后让我的应用程序崩溃了。这是更新代码;
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
invalidate(); // canvas's update
}
}, 20, 20);
我该怎么办?
编辑:错误日志:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
答案 0 :(得分:0)
在这种情况下,在后台线程上调用run()
,并在该后台线程上调用invalidate()
。这将导致您在问题中遇到的异常,因为这些更新只能在主应用程序线程上完成。
由于调用invalidate()
50次/秒不太可能是您尝试解决的任何问题的正确解决方案,您可能希望提出一个单独的Stack Overflow问题,解释您正在尝试的各种更改每20毫秒到你的用户界面,看看推荐的方法是什么。或者,拿起一本关于Android游戏开发的书 - 虽然你可能没有构建游戏,但是游戏开发者对Canvas
的描述也存在这些问题,所以他们使用的技术也可能与你相关
答案 1 :(得分:0)
如果你真的想要这样做,只需将invalidate
更改为postInvalidate
即可。