Websocket出现Android错误

Websocket出现Android错误,android,websocket,Android,Websocket,我正在开发Websocket android应用程序。我想用websocket创建注册和登录应用程序。我能够使用连接到websocket服务器。我已经创建了带有在线引用的注册、登录活动。在注册活动中,当我使用websocketclient Java类的“发送”方法将注册数据存储到服务器时,我得到了“Java.lang.NullPointerException:尝试调用虚拟方法'void org.Java_websocket.client.websocketclient.send(Java.lan

我正在开发Websocket android应用程序。我想用websocket创建注册和登录应用程序。我能够使用连接到websocket服务器。我已经创建了带有在线引用的注册、登录活动。在注册活动中,当我使用websocketclient Java类的“发送”方法将注册数据存储到服务器时,我得到了“Java.lang.NullPointerException:尝试调用虚拟方法'void org.Java_websocket.client.websocketclient.send(Java.lang.String)“在空对象引用上”我的日志cat窗口中出现错误

以下是我的主要活动:

package org.asperohgedgetws.a7.hgadgetws;
import android.app.Activity;
import android.app.Fragment;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.net.URISyntaxException;
import android.widget.Button;
import android.widget.Toast;
import android.content.Intent;

public class MainActivity extends Activity implements View.OnClickListener {
Button bLogout;
UserLocalStore userLocalStore;
private WebSocketClient mWebSocketClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bLogout = (Button) findViewById(R.id.bLogout);
    bLogout.setOnClickListener(this);
    userLocalStore = new UserLocalStore(this);
    connectWebSocket();
}
@Override
protected void onStart() {
    super.onStart();
    if (authenticate()== true){
        displayUserDetails();
    } else{
        Toast.makeText(getApplicationContext(), "Not Registered User :(", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(MainActivity.this,Login.class));
    }
}

private boolean authenticate(){
    return userLocalStore.getUserLoggedIn();
}

private void displayUserDetails(){
    User user = userLocalStore.getLoggedInUser();
}

@Override
public void onClick(View v) {
    switch(v.getId()){
        case R.id.bLogout:
            startActivity(new Intent(this,Login.class));
            userLocalStore.clearUserData();
            userLocalStore.setUserLoggedIn(false);
            Toast.makeText(getApplicationContext(), "Logout :)", Toast.LENGTH_SHORT).show();
            break;

    }
}

private void connectWebSocket() {
    URI uri;
    try {
        uri = new URI("ws://xxx.xxx.xxx.xxx:xxxx");
    } catch (URISyntaxException e) {
        e.printStackTrace();
        return;
    }

    mWebSocketClient = new WebSocketClient(uri) {
        @Override
        public void onOpen(ServerHandshake serverHandshake) {
            Log.i("Websocket", "Opened");
            //mWebSocketClient.send("Hello from " + Build.MANUFACTURER + " " + Build.MODEL);
            mWebSocketClient.send("{\"1512BD002\":\"SO@0\":\"2\"}");
        }

        @Override
        public void onMessage(String s) {
            final String message = s;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //TextView textView = (TextView)findViewById(R.id.messages);
                    //textView.setText(textView.getText() + "\n" + message);
                }
            });
        }

        @Override
        public void onClose(int i, String s, boolean b) {
            Log.i("Websocket", "Closed " + s);
        }

        @Override
        public void onError(Exception e) {
            Log.i("Websocket", "Error " + e.getMessage());
        }
    };
    mWebSocketClient.connect();
}

public void sendMessage(View view) {
 //   EditText editText = (EditText)findViewById(R.id.message);
   // mWebSocketClient.send(editText.getText().toString());
    //editText.setText("");
}
}
注册活动

package org.asperohgedgetws.a7.hgadgetws;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.java_websocket.handshake.ServerHandshake;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import org.java_websocket.client.WebSocketClient;

public class Register extends AppCompatActivity implements View.OnClickListener {

Button bRegister;
EditText etName, etAge, etUsername, etPassword;
WebSocketClient nwebsocket;

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

    etName = (EditText) findViewById(R.id.etName);
    etAge = (EditText) findViewById(R.id.etAge);
    etUsername = (EditText) findViewById(R.id.etUsername);
    etPassword = (EditText) findViewById(R.id.etPassword);
    bRegister = (Button) findViewById(R.id.bRegister);
    bRegister.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.bRegister:
            // Toast.makeText(getApplicationContext(), "Register", Toast.LENGTH_SHORT).show();

            String name = etName.getText().toString();
            int age = Integer.parseInt(etAge.getText().toString());
            String username = etUsername.getText().toString();
            String password = etPassword.getText().toString();

            User user = new User(name, age, username, password);
            registerUser(user);

            break;
    }
}

private void registerUser(User user) {
    String strtosend = "";
    JSONObject object = new JSONObject();
    try {
        // Add the id to the json
        object.put("name", user.name);
        object.put("age", user.age);
        object.put("username", user.username);
        object.put("password", user.password);
        strtosend = object.toString();

    } catch (JSONException e) {
        // Handle impossible error
        e.printStackTrace();
    }
    Toast.makeText(getApplicationContext(), strtosend, Toast.LENGTH_SHORT).show();
    nwebsocket.send("Hi!");
    Intent loginIntent = new Intent(Register.this, Login.class);
    startActivity(loginIntent);
}
}
Logcat输出:

05-27 11:49:54.331 19459-19459/org.asperohgedgetws.a7.hgadgetws       E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                 Process: org.asperohgedgetws.a7.hgadgetws, PID: 19459
                                                                              java.lang.NullPointerException: Attempt to invoke virtual method 'void org.java_websocket.client.WebSocketClient.send(java.lang.String)' on a null object reference
                                                                                   at org.asperohgedgetws.a7.hgadgetws.Register.registerUser(Register.java:73)
                                                                                  at org.asperohgedgetws.a7.hgadgetws.Register.onClick(Register.java:51)
                                                                                  at android.view.View.performClick(View.java:4780)
                                                                                  at android.view.View$PerformClick.run(View.java:19866)
                                                                                  at android.os.Handler.handleCallback(Handler.java:739)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                  at android.os.Looper.loop(Looper.java:135)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
我必须在注册活动中再次使用下面的代码吗

private void connectWebSocket() {
    URI uri;
    try {
        uri = new URI("ws://xxx.xxx.xxx.xxx:xxxx");
    } catch (URISyntaxException e) {
        e.printStackTrace();
        return;
    }

    nWebsocketClient = new WebSocketClient(uri) {
        @Override
        public void onOpen(ServerHandshake serverHandshake) {
            Log.i("Websocket", "Opened");
        }

        @Override
        public void onMessage(String s) {
            final String message = s;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                }
            });
        }

        @Override
        public void onClose(int i, String s, boolean b) {
            Log.i("Websocket", "Closed " + s);
        }

        @Override
        public void onError(Exception e) {
            Log.i("Websocket", "Error " + e.getMessage());
        }
    };
    nWebsocketClient.connect();
}

问题是您的
nwebsocket
从未初始化,其值为
null
,这就是您在尝试执行
send
方法时出现此错误的原因

您需要在某个地方对其进行初始化:

nwebsocket = new WebSocketClient(...);
注意:如果您想在
MainActivity
Register
活动之间共享
WebSocketClient
的同一实例,可以在
MainActivity

public static WebSocketClient mWebSocketClient;

然后从
注册表中删除
WebSocketClient-nwebsocket
,并使用
MainActivity.mWebSocketClient

可能重复我得到的是NPE,但在我的情况下3我如何解决它?我正在mainActivity中打开websocket连接,如何使用发送功能发送注册活动中的注册数据。我是Android/Java编码的新手,所以需要理解。请不要介意。是的,我明白你的意思。在主要活动中,我正在打开一个Websocket连接。现在在注册活动中,我为什么要再次启动thw连接?我想通过当前打开的套接字连接发送数据。这就是为什么我只想使用send mathod。谢谢fiddler,你编辑的答案对我有用。非常感谢你。通过公开,它可以被其他类所接受。现在我在main活动中有了一个抽象方法,它读取来自服务器“public void onMessage(String s)”的传入消息。我需要从这个方法中读取消息,并希望在登录活动和注册活动中使用。嘿,Fiddler,我需要创建一个不同的类来处理输入数据。当我的任何活动需要接收数据时,会从该类成员函数中获取数据吗?我走对了吗?