0

我正在android平台上编写一个服务器客户端。如果其中一个客户端向其中一个发送消息,则首先将消息发送到服务器,然后服务器将其发送给客户端。当接收者客户端收到消息时,setContentView我必须打开消息屏幕。但它在不同的线程中接收消息,我将我的活动类作为参考传递。

Thread my = new MyThread(this);

并且在线程类中我无法设置内容视图,因为给出了一个错误,比如ViewRoot CalledFromWrongThread我该怎么办?

4

3 回答 3

7

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
    }
});
于 2012-07-20T12:58:35.537 回答
2
ActivityName.this.runOnUiThread(new Runnable() {
     @Override
     public void run() {
         // set contentview here
     }
});
于 2012-07-20T13:00:32.710 回答
0
ActivityName.this.runOnUiThread(new Runnable() {
     @Override
     public void run() {

     }
});
于 2012-07-20T13:56:22.227 回答