我正在android平台上编写一个服务器客户端。如果其中一个客户端向其中一个发送消息,则首先将消息发送到服务器,然后服务器将其发送给客户端。当接收者客户端收到消息时,setContentView
我必须打开消息屏幕。但它在不同的线程中接收消息,我将我的活动类作为参考传递。
Thread my = new MyThread(this);
并且在线程类中我无法设置内容视图,因为给出了一个错误,比如ViewRoot CalledFromWrongThread
我该怎么办?
我正在android平台上编写一个服务器客户端。如果其中一个客户端向其中一个发送消息,则首先将消息发送到服务器,然后服务器将其发送给客户端。当接收者客户端收到消息时,setContentView
我必须打开消息屏幕。但它在不同的线程中接收消息,我将我的活动类作为参考传递。
Thread my = new MyThread(this);
并且在线程类中我无法设置内容视图,因为给出了一个错误,比如ViewRoot CalledFromWrongThread
我该怎么办?
UIThread 是应用程序执行的主线程。这是运行大多数应用程序代码的地方。您的所有应用程序组件(Activity、Services、ContentProviders、BroadcastReceivers)都在这个线程中创建,并且对这些应用程序的任何系统调用都在这个线程中执行。
当你显式地生成一个新线程在后台做工作时,这段代码并不是不在 UIThread 上运行。那么如果这个后台线程需要做一些改变 UI 的事情会发生什么呢?这就是
runOnUiThread
它的用途。实际上,您应该使用 Handler(有关更多信息,请参见下面的链接);它为这些后台线程提供了执行可以修改 UI 的代码的能力。他们通过将 UI 修改代码放入 Runnable 对象并将其传递给 RunOnUiThread 方法来实现此目的。
(有关什么是 UI 线程的更详细说明,请参阅https://stackoverflow.com/a/3653478/448625 )
简而言之,这应该解决它:
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() {
}
});