0

我有两个类:Server 类(普通 java 类)和 MainActivity 类(android 活动类)。我正在尝试使用 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。

我在代码中做错了吗?我应该如何访问静态变量?或者它甚至不必是静态的,我如何简单地访问变量clientMsg而不返回空值?

/编辑/

抱歉,我的问题不清楚。我实际上是分别运行这 2 个类,一个作为纯 Java 显示在控制台中,另一个显示在 Android 模拟器中,最后,我在我的 android 手机中运行了一个客户端应用程序。

所以基本上,我使用客户端应用程序向服务器发送一条消息,该服务器将消息的值存储在clientMsg变量中。然后我尝试使用 System.out.println() 显示 clientMsg 的值,它可以工作!但是当我访问 MainActivity 中的变量时,它的值变为空。为什么会这样?

4

7 回答 7

4

无论您如何访问clientMsg它都没有设置任何值。

所以你总会得到null

如果您希望 main 方法自动运行,它就不会发生。您可以手动调用它。或者使用静态块进行初始化。

编辑 :

您似乎在两个单独的 JVM 中运行它们。静态类是每个 JVM 一个。因此,当您单独运行它们时,另一个人将看不到其中一个更改...

于 2013-06-07T06:45:33.617 回答
1

类中的静态 main() 方法仅在您“执行”类时自动调用 -

  1. 从控制台使用命令作为java package.name.Server
  2. 从像 Eclipse 这样的 IDE 通过将其作为“Java 应用程序”运行
  3. 从一个构建工具开始,该过程基本上执行上面第 1 点中所写的内容。

如果您Server在 Android 应用程序中使用,这些都不是真的。因此,如果您希望执行该方法,则需要自己调用它,例如在 Activity 开始时调用它。

但是,签名public static void main()通常仅在将类作为 Java 应用程序运行时默认调用,因此正如 Homam 所提到的,您应该将代码移动到 get 方法以进行延迟初始化。或者,至少将主方法重命名为类似init()的名称,并以其他方式自己处理类/变量的初始化。

编辑(基于 OP 提供的反馈):

您需要记住的是,这些规则仅适用于两个类在同一虚拟机中运行时。如果 Server 类在 Eclipse 中执行,它会在 Eclipse 使用/派生的 JVM 中运行。Android Emulator 内部发生的事情发生在 Android 附带的 Dalvik VM 中。就这两种环境而言,这与在两台完全不同的机器上运行它们没有什么不同。它们是两个不同的类加载器,两个不同的内存空间,在这种情况下,是两种不同的虚拟机技术。

于 2013-06-07T07:10:34.497 回答
0

这是问题所在:

clientMsg 的初始值将为空。现在您正在通过编写在 main 函数中的代码为 clientMsg 赋值,并且永远不会调用 main 函数。

所以 clientMsg 的值保持为空。

解决方案:将整个代码放在 getClientMsg() 方法中。

于 2013-06-07T07:53:58.337 回答
0

你的 Server.main 方法是否被调用过?

无论如何,Android 有时会杀死您的进程并为您启动它,试图将其恢复到最后一个状态。如果你不仔细听这些事件,你最终可能会错过这个。在这些重新启动之间,静态变量将重置为其默认值。

不幸的是,我找不到描述应用程序生命周期的像样的文档,只有一个描述活动生命周期的文档。我不想粗鲁,所以我们只说Android通常使用吸力将东西从一个地方移动到另一个地方。

于 2013-06-07T06:48:45.350 回答
0

永远不会调用为您的静态变量赋予某些值的主函数。与普通的 java 应用程序不同,Android 不会为您调用 main 函数。所以它永远是空的。

于 2013-06-07T06:47:31.870 回答
0

main functiontogetClientMsg function和 remove的代码放在main function这里,这里不需要。

于 2013-06-07T06:49:06.837 回答
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 回答