【发布时间】: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 操作。还要确保在服务被销毁时关闭连接。
-
恐怕就是这样.. 以任何其他聊天应用程序为例,他们都在做同样的事情。应用程序被杀 -> 人下线......然后推送通知来派对..