0

サーバー クラス (プレーン Java クラス) と MainActivity クラス (Android アクティビティ クラス) の 2 つのクラスがあります。MainActivity を使用して Server クラスから静的変数にアクセスしようとしていますが、静的変数を使用しようとするたびに、常に null が返されます。

Server クラスのコードは次のとおりです。

public class Server {

  private static String clientMsg;

  public static String getClientMsg() {
      return clientMsg;
  }

  public static void main(String[] args){

    /*Some Server code here*/

    while(true){
        try {
            clientSocket = serverSocket.accept();

            //READ THE MESSAGE SENT BY CLIENT
            dataInputStream = new DataInputStream(clientSocket.getInputStream());

            //Here is where I assigned the static variable clientMsg
            clientMsg = dataInputStream.readUTF();

            dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
            dataOutputStream.writeUTF("Message Received!");

        } catch (IOException e) {
            e.printStackTrace();
        }

   /* Rest of the code here */
  }
 }
}

MainActivity クラスのコードは次のとおりです。

public class MainActivity extends FragmentActivity implements LocationListener{
  private Button connect;
  /*Some variable declarations here*/

  @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main); 

      connect = (Button) findViewById(R.id.connect);

      /*Some code here*/

      connect.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                String msg = Server.getClientMsg();
                if(msg != null)
                    Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
                else
                    Toast.makeText(MainActivity.this, "Client Message is null!", Toast.LENGTH_LONG).show();
            }
        });
    /*Rest of the code here*/
  }
}

Serverクラスから静的変数clientMsgにどのようにアクセスしても、常に null が返されます。

コードで何か間違ったことをしましたか? 静的変数にアクセスするにはどうすればよいですか? または、静的である必要さえありません.null値を返さずに変数clientMsgにアクセスするにはどうすればよいですか?

/編集/

私の質問が明確でなくて申し訳ありません。私は実際に 2 つのクラスを別々に実行しています。1 つはコンソールに表示されるプレーン Java として、もう 1 つは Android エミュレーターに表示されます。最後に、Android フォンでクライアント アプリを実行しています。

したがって、基本的には、クライアント アプリを使用してサーバーにメッセージを送信し、サーバーはメッセージの値をclientMsg変数に格納します。次に、System.out.println() を使用して clientMsg の値を表示しようとしましたが、うまくいきました。しかし、MainActivity の変数にアクセスすると、その値は null になります。それがなぜなのか、何か理由はありますか?

4

7 に答える 7

4

どのようにアクセスしclientMsgても、値が設定されていません。

だからあなたはいつも得るでしょうnull

万が一、メイン メソッドが自動的に実行されることを期待しても、それは起こりません。手動で呼び出すことができます。または、静的ブロックを使用して初期化を行います。

編集 :

それらを 2 つの別個の JVM で実行しているようです。静的クラスは、JVM ごとに 1 つです。したがって、それらを個別に実行すると、一方の変更が他方に表示されません...

于 2013-06-07T06:45:33.617 に答える
0

静的変数に何らかの値が与えられるメイン関数は呼び出されません。Android は、通常の Java アプリとは異なり、メイン関数を呼び出しません。したがって、常に null になります。

于 2013-06-07T06:47:31.870 に答える
0

問題は次のとおりです。

clientMsg の初期値は null です。これで、main 関数内に記述されたコードを介して clientMsg に値が割り当てられ、main 関数が呼び出されることはありません。

したがって、clientMsg の値は null のままです。

解決策: コード全体を getClientMsg() メソッド内に配置します。

于 2013-06-07T07:53:58.337 に答える
0

このようにしてみてください:

public class Server {

    private static String clientMsg;

    public static String getClientMsg() {
        while (true) {
            try {
                clientSocket = serverSocket.accept();

                // READ THE MESSAGE SENT BY CLIENT
                dataInputStream = new DataInputStream(
                        clientSocket.getInputStream());

                // Here is where I assigned the static variable clientMsg
                clientMsg = dataInputStream.readUTF();

                dataOutputStream = new DataOutputStream(
                        clientSocket.getOutputStream());
                dataOutputStream.writeUTF("Message Received!");

            } catch (IOException e) {
                e.printStackTrace();
            }

            /* Rest of the code here */
        }

        return clientMsg;
    }

}
于 2013-06-07T06:57:36.487 に答える
0

Server.main メソッドが呼び出されたことはありますか?

とにかく、Android はプロセスを強制終了して起動し、最後の状態に戻そうとすることがあります。イベントを注意深く聞いていないと、これを見逃す可能性があります。これらの再起動の間に、静的変数はデフォルト値にリセットされます。

残念ながら、アプリケーションのライフサイクルを説明した適切なドキュメントを見つけることができませんでした。アクティビティのライフサイクルを説明したドキュメントは 1 つだけです。失礼なことを言いたくないので、Android は通常、吸引を使用してある場所から別の場所に物を移動するとだけ言っておきましょう。

于 2013-06-07T06:48:45.350 に答える
0

main functiontogetClientMsg functionと removeのコードを入れmain functionてください。ここでは必要ありません。

于 2013-06-07T06:49:06.837 に答える