0

私はこのコードを持っています:

    @Override
    public void onClick(View v) {
        if (!connected) {
            serverIpAddress = serverIp.getText().toString();
            if (!serverIpAddress.equals("")) {
                Thread cThread = new Thread(new ClientThread());
                cThread.start();                   
            }
        }
    }
};

private OnClickListener communicateListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        message = messageServer.getText().toString();
        if (!serverIpAddress.equals("")) {
            cThread.run();
            //Thread cThread = new Thread(new ClientThread());
            //cThread.start();
        }                  

    }
};

public class ClientThread implements Runnable {

    public void run() {           
          if (socket==null)
              connect to the server;
          else
              do smth else;
    }

私が欲しいのは、スレッドを作成する connectListener と、接続を確立するスレッドです。次に、communicationListener をクリックすると、アプリはソケットから読み取るか、ソケットに書き込みます。これを実装する方法がわかりません。

communicateListener の onclick メソッドでどうにかスレッドを再度呼び出す必要がありますか? または、継続的に実行されており、ソケットがnull以外の場合は「他のことを行う」のですか?

run 関数を再度呼び出してみましたが、NullPointerException が発生しました。communicateListener で新しいスレッドを作成するとうまく動作しますが、ボタンをクリックするたびに新しいスレッドを作成したくありません。

ありがとうございました

4

2 に答える 2

3

まず、スレッドのrun()メソッドを呼び出さないでください。コードは新しいスレッドでは実行されず、現在のスレッドで実行されます。代わりにそのメソッドを呼び出しますstart()(すぐにrun()メソッドになる新しいスレッドを開始するため)。

スレッドがメソッド内のコードをrun()使い果たす (または明示的にメソッドから戻る) と、スレッドは終了します。オブジェクトはまだ存在している可能性があり、そこからデータを取得できます (必要なものがある場合)。ただし、スレッドを再度開始することはできません。代わりに、新しいインスタンスを作成して開始する必要があります。

スレッドを一度作成し、実際の作業を待っている間に「他のことをさせる」ことが意図されている場合は、それを行うこともできますが、「作業が必要なときに新しいスレッドを開始する」とは使用モデルが異なります。終わり"。どちらの使用モデルにもそれぞれの役割がありますが、「必要なときに開始する」モデルの方が実装が簡単であり、より複雑なモデルによって得られる効率が、UI アクションに関連付けられている場合に十分な効果を発揮する可能性はほとんどありません。

于 2013-02-12T12:46:46.757 に答える
1

ドキュメントを使用する前にドキュメントを読んでいないように見えます。Java でのスレッド化について理解していないことは明らかだからです。次の章を読むと思います: http://docs.oracle.com/javase/tutorial/essential/concurrency/

しかし、要約すると、スレッドを機能させるには、「start()」を呼び出すと、スレッドが起動し、「run()」関数が呼び出されます。run() 関数が終了すると、スレッドは終了します。

したがって、同じアクションをもう一度実行する場合は、スレッドの新しいインスタンスを作成して、もう一度開始します。

于 2013-02-12T12:50:35.677 に答える