java - 在 Activity A中连接到websocket并在 Activity B中接收数据

标签 java android android-fragments android-activity websocket

我有一个 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/

相关文章:

android - 如何设置android字体系列使宽度相同?

android - 使用哪种方法将参数传递给 Fragment

java - 如何在没有任何重复/重复字符串的情况下随机化数组?

java - 在 Web 应用程序 DAO 中使用 StringBuffer 或 StringBuilder

java - 修剪在 mongodb java 驱动程序中保存为值的字符串的双引号

java - 如何为 Android Fragment(Tabs Activity) 实现 onBackPressed

java - 无法访问扩展 fragment 的静态嵌套类中的 ListView

java - Spring中如何实现基于客户端 token 的限速?

android - 如何在android中的 map v2上设置自定义放大缩小按钮

android水平 ScrollView