【问题标题】:My event emitter is working fine but I'm unable to receive the information fired by JS我的事件发射器工作正常,但我无法接收 JS 触发的信息
【发布时间】:2017-09-25 14:59:33
【问题描述】:

我和Android Emitter.Listener not working有同样的问题 问题,但该问题中给出的答案没有帮助,我什至找不到任何解决方案。有人可以帮我解决这个问题吗?

在我的代码中,我将 base64 字符串发送到 node.js 服务器,该服务器保存文件并将链接发送回给我(文件保存工作正常)。即使链接没有被烘烤。

我的代码是:

public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
socket.connect();
    socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            socket.on("data", handleIncomingMessage);
        }
    });}
//Onclick of a button
JSONObject obj=new JSONObject();
            try {
                obji.put("profile_pic",image);
                socket.emit("data",obji);
            } catch (JSONException e) {
                e.printStackTrace();
            }
    private Emitter.Listener handleIncomingMessage = new Emitter.Listener(){

    @Override
    public void call(final Object... args){
        Toast.makeText(getActivity().getApplicationContext(),"Hello India",Toast.LENGTH_LONG).show();
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                JSONObject data = (JSONObject) args[0];
                //JSONObject d=(JSONObject) args[1];
                String imgLink;
                try {
                    imgLink = data.getString("data").toString();
                    Glide.with(getContext()).load(imgLink).asBitmap().dontAnimate().into(imageView);

                    Toast.makeText(getActivity().getApplicationContext(),imgLink,Toast.LENGTH_LONG).show();


                } catch (JSONException e) {
Toast.makeText(getActivity().getApplicationContext(),e.toString(),Toast.LENGTH_LONG).show();
                }

            }
        });
    }
};

【问题讨论】:

  • 已经给出答案了!

标签: android socket.io event-listener


【解决方案1】:

我想我可以。您看到您确实连接到您的服务器,但该连接需要一段时间,在此之前您立即将onSendFile 消息处理程序设置为套接字实例。理想情况下,您应该设置消息处理程序AFTER与服务器成功建立连接。

此外,您应该使用socket.emit AFTER 发出您自己的消息,上述事件。 为此,只需编写:

mSocket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
            @Override
            public void call(Object... args) {

                mSocket.on("send file", onSendFile);
            }
        });
mSocket.connect();

这样,在EVENT_CONNECT 发生之后,即在与服务器的连接建立之后,处理程序就会被添加到实例中。

旁注:另外,当活动被销毁时,不要忘记从套接字实例中删除处理程序。在活动的onDestroy 方法中调用mSocket.off("send file", onSendFile)。这样,如果onSendFile 中的代码使用活动的任何 UI 组件,来自服务器的任何事件都不会导致您的应用程序崩溃。
干杯!

【讨论】:

  • 感谢您的关注,先生,但它无法解决我的问题
  • 好的。您希望何时调用 mSocket.on("send file", onSendFile)?我的意思是您的服务器何时在所有连接流中向您发送响应?我在任何地方都没有看到emit
  • 你的socket.on("event name", handleIncomingMessage)?在哪里
  • 对不起,我忘了添加,但它在 onCreate() 现在检查我的代码
猜你喜欢
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多