我有一个活动设置自定义创建的视图“onCreated”并启动一个Thread,这个线程每隔23ms循环一次并“使这个视图无效”,因此几乎总是调用onDraw。
此视图在屏幕上继续,直到用户点击它(onTouchEvent)并且视图执行了一些操作,并且当准备好启用公共标记时,活动“知道”视图何时被激活并且已经进行了,此时活动应该将它的视图更改为另一个自定义创建的,问题是因为标志检查是在线程的run方法中完成的,活动发送一个“CallFromWrongThreadException”,这是因为据我所知“更改”是在另一个线程(不是UI)。
我已将runOnUiThread设置为悬空,并且srceen将完全变为黑色。
此外,我还尝试将活动设置为一个framelayout,我在其中添加了两个视图,并且线程更改了视图的可见性,完全没有成功。
答案 0 :(得分:1)
所有视图操作都必须在UI线程上进行。有几种方法可以做到这一点。一种是使用AsyncTask来执行后台工作,因为它具有在后台工作完成后在UI线程上运行代码的方法。
另一个选择是发布您想要通过视图本身运行的代码,如下所示:
mMyView.post(new Runnable() {
public void run() {
mMyView.doSomething();
}
});
此方法适用于切换现有视图的可见性。
这是对这些方法的一个很好的概述:http://android-developers.blogspot.com/2009/05/painless-threading.html