3

オンラインでコードを見ました。TextViewのテキストを設定するためにrunnableを使用する必要があるのはなぜですか?ありがとう!

    while (true) {
    // listen for incoming clients
    Socket client = serverSocket.accept();
    handler.post(new Runnable() {
        @Override
        public void run() {
            serverStatus.setText("Connected.");
        }
    });

http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

4

2 に答える 2

7

このアプリケーションはマルチスレッドですよね?その場合、UIで操作を実行できるのは1つのスレッド(UIスレッド)のみです。新しいスレッドを手動で作成しない場合は、これについて心配する必要はありません。自分で新しいスレッドを開始し、UI関連の処理(serverStatusテキストフィールドのテキストの更新など)を実行したい場合は、UIスレッドで実行する必要があります。この規則に従わないと、例外が発生します。

ハンドラーは、スレッド間でメッセージを渡す方法として使用されます。この場合、UIスレッドにはハンドラーがあり、サーバースレッドの作成時にパラメーターとして送信されました。UIを更新する必要があるたびに、UIスレッドにメッセージを投稿します。UIスレッドは定期的に新しいメッセージをチェックし、それらに添付されたRunnablesを実行します。

少しよく理解するのに役立つ可能性のある別のリンク(例を含む)は次のとおりです:http: //developer.android.com/guide/appendix/faq/commontasks.html#threading

于 2010-12-21T23:27:36.947 に答える
1

そのコードはサーバースレッドにあります。UI(この場合はedittext)は、Uithreadでのみ更新できます。Runnableを使用すると、UIスレッドに戻ることができます。参照:http ://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable )

于 2010-12-21T23:18:46.570 に答える