0

私はAndroidプラットフォームでサーバークライアントを書いています。クライアントの1つがメッセージを送信すると、最初にメッセージがサーバーに送信され、サーバーがクライアントに送信します。受信者のクライアントがメッセージを受信したら、setContentViewメッセージ画面を開く必要があります。しかし、それは別のスレッドでメッセージを受け取り、参照としてアクティビティクラスを渡します。

Thread my = new MyThread(this);

ViewRoot CalledFromWrongThreadスレッドクラスでは、何ができるかなどのエラーが発生するため、コンテンツビューを設定できません。

4

3 に答える 3

7

UIThreadは、アプリケーションの実行のメインスレッドです。これは、ほとんどのアプリケーションコードが実行される場所です。すべてのアプリケーションコンポーネント(アクティビティ、サービス、ContentProviders、BroadcastReceivers)はこのスレッドで作成され、これらのアプリケーションへのシステムコールはすべてこのスレッドで実行されます。

バックグラウンドで作業を行うために新しいスレッドを明示的に生成する場合、このコードはUIThreadで実行されません。では、このバックグラウンドスレッドがUIを変更する何かを行う必要がある場合はどうなりますか?これがrunOnUiThread目的です。実際には、ハンドラーを使用することになっています(これに関する詳細については、以下のリンクを参照してください)。これらのバックグラウンドスレッドに、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 に答える