我正在android平台上编写一个服务器客户端。若其中一个客户端向其中一个发送消息,则消息首先到达服务器,然后服务器将其发送到客户端。当接收方客户端收到消息时,我必须setContentView
,所以我需要打开消息屏幕。但它将消息放在另一个线程中,我将活动类作为引用传递。
Thread my = new MyThread(this);
在线程类ı无法设置内容视图,因为给出了ViewRoot CalledFromWrongThread
这样的错误,我该怎么办?
UIThread是应用程序执行的主线程。这是大多数应用程序代码的运行位置。你所有的应用程序组件(活动、服务、内容提供商、,BroadcastReceivers),并且任何系统调用对那些应用程序的调用是在这个线程中执行的。
当您显式生成一个新线程以在后台进行工作时,此代码不是在UIThread上运行的。那么,如果这个后台线程需要做一些改变UI的事情吗?这是
runOnUiThread
的作用。实际上你应该使用处理程序(请参阅下面的链接了解更多信息);它提供了这些后台线程执行可以修改UI的代码的能力。他们将UI修改代码放在Runnable对象中将其传递给RunOnUiThread方法。
(请参见https://stackoverflow.com/a/3653478/448625对于什么是UI线程的更详细解释)
简而言之,这应该可以解决问题:
runOnUiThread(new Runnable() {
public void run() {
// some code that needs to be ran in UI thread
}
});
ActivityName.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// set contentview here
}
});
ActivityName.this.runOnUiThread(new Runnable() {
@Override
public void run() {
}
});