我有一个 fragment A,其中我正在建立一个 websocket 连接,连接成功后它将打开另一个 fragment B,现在在这个 fragment 中我想从创建的 websocket 连接接收数据并仅在 TextView 中显示数据。 我通过从服务器获取字符串中的标志来确定 websocket 是否成功。它运行良好。 现在 websocket 连接成功并且正在打开另一个 fragment 。 但在新的新 fragment 中,它没有从服务器接收数据。我该怎么做,请帮助我编写一些代码,因为我是 websocket 的新手。
简而言之, fragment A 是工作文件,我想知道在 fragment B 中做什么才能从 fragment A 中创建的连接接收数据。我在 fragment B 中编写的代码只是假设强>
fragment A
//calling start in a button click
private void start(String ip, String dev_pass) {
String URL = "some URL";
Request request = new Request.Builder().url(URL).build();
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("key",dev_pass);
} catch (JSONException e) {
e.printStackTrace();
}
CustomWebSocketListener listener = new
CustomWebSocketListener(jsonObject);
WebSocket ws = client.newWebSocket(request, listener);
}
}
private final class CustomWebSocketListener extends WebSocketListener {
private static final int NORMAL_CLOSURE_STATUS = 1000;
JSONObject credintials;
public CustomWebSocketListener(JSONObject credintials) {
this.credintials = credintials;
}
@Override
public void onOpen(final WebSocket webSocket, Response response) {
webSocket.send(String.valueOf(credintials));
}
@Override
public void onMessage(WebSocket webSocket, String text) {
output(text);
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
output(text);
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
webSocket.close(NORMAL_CLOSURE_STATUS, null);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
}
}
private void output(final String text) {
String err_code = "";
try {
JSONObject jsonObject = new JSONObject(text);
err_code = jsonObject.getString("err_code");
if (err_code.equalsIgnoreCase("0")) {
// here open fragment B as the error is 0 and
// that means the connection is successful
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new BFragment()).commit();
} else {
// do something if json errorcode is 1
}
} catch (Exception e) {
e.printStackTrace();
}
}
fragment B
in OnCreate() ------
String URL = "SAME URL";
Request request = new Request.Builder().url(URL).build();
CustomWebSocketListener listener = new CustomWebSocketListener();
WebSocket ws = client.newWebSocket(request, listener);
------
private final class CustomWebSocketListener extends WebSocketListener {
private static final int NORMAL_CLOSURE_STATUS = 1000;
public CustomWebSocketListener() {
}
@Override
public void onOpen(final WebSocket webSocket, Response response) {
// not doing anything as already conneted
// i dont know if this approach is right or wrong
}
@Override
public void onMessage(WebSocket webSocket, String text) {
Toast.makeText(getActivity(), text,
Toast.LENGTH_LONG).show();
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
webSocket.close(NORMAL_CLOSURE_STATUS, null);
Toast.makeText(getActivity(), "Closing",
Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
Toast.makeText(getActivity(), "Fail",
Toast.LENGTH_LONG).show();
}
}
最佳答案
创建一个用于套接字操作的 Singleton 类。这样,您就可以从任何地方访问套接字类,并可以在任何类中注册回调。
关于java - 在 Activity A中连接到websocket并在 Activity B中接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57196009/