如何解决将 lambda 对象的引用传递给另一个类方法,导致 Java 中的 NullPointerException
我想创建一个委托模式,其中从一个类方法收到的结果然后被另一个类方法使用。这里我有 2 个类,SocketListener
和 SocketConsumer
,第一个监听从 WebSocket 服务器发送的消息,第二个使用这个消息。
在我的 SocketListener
课上:
public class SocketListener extends WebSocketListener {
private final String TAG = SocketListener.class.getName();
private Consumer<String> msgConsumer;
@Override
public void onMessage(@NotNull WebSocket webSocket,@NotNull String text) {
// delegate this message to another class.
Log.d(TAG,"Receive msg from the server " + text);
consumeMessage(text);
}
public void setMsgConsumer(Consumer<String> msgConsumer) {
this.msgConsumer = msgConsumer;
}
public void consumeMessage(String msg) {
if (this.msgConsumer != null) { // the msgConsumer is null!
this.msgConsumer.accept(msg);
} else {
throw new IllegalStateException("No handler");
}
}
// receives a message from the server:
@Override
public void onMessage(@NotNull WebSocket webSocket,"Receive msg from the server " + text);
consumeMessage(text);
}
}
在我的 SocketConsumer
课上:
public class SocketConsumer extends AppCompatActivity {
private final String TAG = SocketConsumer.class.getName();
private WebSocket websocket;
private Button sendBtn;
private TextView editableText;
private TextView serverResponseView;
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(Bundle savedInstanceState) {
// some code removed for brevity ...
super.onCreate(savedInstanceState);
String url = "http://10.0.2.2:8081/ws";
this.websocket = new WebSocketClient(url).getWebSocket();
SocketListener socketListener = new SocketListener();
socketListener.setMsgConsumer(this::consumeMessage);
}
public void consumeMessage(String msg) {
Log.d(TAG,"Consume message sent from the server: " + msg);
JsonObject resp = JsonParser.parseString(msg).getAsJsonObject();
if (!"OK".equals(resp.get("status").getAsstring())) {
serverResponseView.setTextColor(Color.RED);
}
serverResponseView.append(msg);
}
}
当我启动我的Android应用程序时,它应该首先创建一个SocketConsumer
类的实例,然后在onCreate
方法中执行指令,这里我使用方法引用来传递一个lambda表达式为了使用从 SocketListener
类收到的消息,我尝试打印出 msgConsumer
类中 SocketListener
字段的地址,这给了我:com.example.websocket_client.-$$Lambda$pEwgXNeYEcYVwPIH33WBMpCvjM0@fda50e0
。这不是空的,但是当新消息到达并且我调用 consumeMessage
函数时,它是空的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。