【问题标题】:Hold a Socket.IO Connection throughout Application while it in running foreground or background在运行前台或后台时在整个应用程序中保持 Socket.IO 连接
【发布时间】:2019-07-12 04:59:06
【问题描述】:

我已经使用 socket.io 制作了我的一对一和群聊应用程序,一切正常,但是如果我正在与 UI 交互,它会建立连接,但是在我停止与应用程序交互一段时间后,连接中断并且用户离线,因为我没有使用任何事件让我的用户离线。任何人都可以帮助我。

 public  SocketConnection() {
    {
        try {
            nSocket = IO.socket(Constants.NAME_SPACE);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }
}


public Socket getSocket(){
    return  nSocket;
}

这是我让我的用户在线的地方。

 public class SplashActivity extends ActivityManagePermission {
    String permissionAsk[] = {PermissionUtils.Manifest_CAMERA
           , PermissionUtils.Manifest_WRITE_EXTERNAL_STORAGE
          , PermissionUtils.Manifest_READ_EXTERNAL_STORAGE
           };
     Context context = SplashActivity.this;
    private JSONObject mJson;
    SessionManagement session;
private Socket mSocket;
int SPLASH_TIME_OUT = 2000;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    session = new SessionManagement(context);

    /**
     * Creating the socket connection.
     */
    SocketConnection obj = new SocketConnection();
    try {
        mSocket = obj.getSocket();
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }




    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            askCompactPermissions(permissionAsk, new PermissionResult() {
                @Override
                public void permissionGranted() {
                    if(session.isSignedIn()) {
                        mJson = new JSONObject(); //creating json object
                        Object type = "M";
                        Object ID_USER = session.getUserDetails().get(SessionManagement.USER_ID);
                        try {
                            mJson.put("userId", ID_USER);
                            mJson.put("connection_type",type);
                        }catch (JSONException e) {
                            e.printStackTrace();
                        }

                        mSocket.emit(Constants.event_new_user_online,mJson.toString());
                        mSocket.connect();
                        Intent i = new Intent(context,HomeActivity.class);
                        startActivity(i);
                        finish();
                    }else {
                        Intent i = new Intent(context, LoginActivity.class);
                        startActivity(i);
                        finish();
                    }
                }

                @Override
                public void permissionDenied() {
                    Intent i = new Intent(context, SplashActivity.class);
                    startActivity(i);
                    finish();
                }

                @Override
                public void permissionForeverDenied() {
                    Toast.makeText(context,
                            "Please allow the permissions"
                            ,Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(context,SplashActivity.class));
                }
            });

        }

    }, SPLASH_TIME_OUT);
}

}

【问题讨论】:

  • 由于 Android 中引入了后台限制,您无法执行任何连续后台任务。做到这一点的唯一方法是前台服务(对于聊天应用程序根本不推荐)。你是Jobs 和 FCM 消息的依靠。
  • 没有其他方法可以让我的整个应用程序运行良好,我不想切换到 FCM 消息。
  • 所以如果套接字连接丢失如果应用程序处于非活动状态,您可以制作一个定时器,定期检查套接字连接,如果套接字未连接,则建立连接。否则,FCM 是备选方案。
  • 作为最佳实践,不建议您使用通知并相应地编写逻辑以在应用程序进入前台时更新 UI。尽管您可以添加补丁(例如创建前台服务)以使其保持活动状态,但是您将无法执行当应用程序进入前台时您将管理的 UI 操作。还要确保在服务被销毁时关闭连接。
  • 恐怕就是这样.. 以任何其他聊天应用程序为例,他们都在做同样的事情。应用程序被杀 -> 人下线......然后推送通知来派对..

标签: android socket.io


【解决方案1】:

您需要使用Socket IO options

IO.Options options = IO.Options()

options.setTimeout(60000L) // 60 seconds
options.setReconnection(true)

然后在建立连接时像这样使用它。

nSocket = IO.socket(Constants.NAME_SPACE, options);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多