QQ图片20200923114325.png (65.93 KB, 下载次数: 2985)
下载附件 保存到相册
4 年前 上传
微信截图_20200923114516.png (14.36 KB, 下载次数: 3025)
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:JackJiang 发表于 2020-09-23 12:47 按照你的Log显示,每隔45秒断一次,这一定是另有原因。 检查一下:这台手机的登陆ID,是否有别的手机有 ...
111111111111924091353.png (69.69 KB, 下载次数: )
22222222222222924091417.png (28.28 KB, 下载次数: )
333333333333391440.png (15.39 KB, 下载次数: )
引用:暄落 发表于 2020-09-24 09:16 退出登录代码: ----------------------------------------- 注销登录之后初始化的代码
引用:JackJiang 发表于 2020-09-24 10:45 你贴的这个内容,跟你发的帖子问题,是有关联的吗?
引用:暄落 发表于 2020-09-24 10:50 我断开重连,早上怀疑是退出登录-登录,多次导致的问题,结果刚刚我连接sdk中的 run.bat ,发现连接自己 ...
引用:JackJiang 发表于 2020-09-24 12:27 这么规律,一定是其它问题。你排查过,不存在同一账号重复登陆是吧
引用:暄落 发表于 2020-09-24 13:13 是的,我在出现的时候去后端那里看了一下,不存在同一账号重复登陆的情况。
引用:JackJiang 发表于 2020-09-24 13:26 你想做的是,在不退出app的情况下,实现退出当前账号,前重新登陆这样的功能逻辑是吗? 如果是,我就 ...
引用:暄落 发表于 2020-09-24 13:29 嗯嗯,我怀疑是 退出账号→登录另一账号 这样的情况导致的。上边有我的退出登录与登录逻辑,我是仿写的 S ...
// 点击"退出登陆" exitBtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { new AlertDialog.Builder(MoreActivity.this) .setTitle($$(R.string.general_are_u_sure)) .setMessage($$(R.string.main_more_msg_tone_exit_to_login)) .setPositiveButton($$(R.string.general_ok), new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog,int which) { // 退出登陆(但不退出JVM——即不通出APP进程) LoginActivity.doLogoutNoConfirm(MyApplication.getInstance2(), false, new Observer(){ // 此通知将在注册与IM服务器的连接、释放IM资源、释放本APP中所有activity后被通知 @Override public void update(Observable arg0, Object arg1) { // 退出登陆时,取消"自动登陆"的开关量设置 PreferencesToolkits.setAutoLogin(MoreActivity.this, false); // 代码执行至此,表示APP中所有的activity都已被回收(包括本MoreAcvitity), // 而要再次显示登陆界面activity的话,只能借助APP全局唯一的Context——即 // Application实例,以下代码千万不可引用错了Context哦 Context ctx = MyApplication.getInstance2(); Intent iLogin = IntentFactory.createLoginIntent(ctx); // 因Application对象并不是Activity,所以必须要加此flag,否则无法启动Activity iLogin.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 进入登陆activity ctx.startActivity(iLogin); } }); } }) .setNegativeButton($$(R.string.general_cancel), null) .show(); } });
/** * 退出APP的登陆,并释放所有资源。 * <p> * 注:方法中不涉及任何GUI,用在多线程中调用也没事。 * * @param context * @param exitJVM true表示完成退出APP(可用于完关闭应用时),否则表 * 示仅退出所有Activity(可用于切换到登陆界面重新登陆等场景下) * @param obsAfterLogoutIMServer 本观察者将在logout im server完成后,被 * 调用,当前此参数已知的是在更多界面中的”退出登陆“时使用了。一般来说,本参数 * 的设置只在exitJVM参数=false时才有意义,请参见源码 */ public static void doLogoutNoConfirm(final Context context, final boolean exitJVM , final Observer obsAfterLogoutIMServer) { // TODO 退出登陆时如有其它事情要处理,可在此补充! // 【1】注销HTTP服务器的登陆 。。。。。。。。 // 【2】注销IM服务器连接并释放IM框架所占的所有资源 IMClientManager.doLogoutIMServer(context , new Observer(){// 为何要使用观察者?因退出登陆数据发送是在异步线程中实现的, // 使用观察者的目的是确保退出JVM等是在数据已发送完成后再行的哦!!!! @Override public void update(Observable observable, Object data) { // 释放APP应用占用的资源 systemExit(context, exitJVM); // if(obsAfterLogoutIMServer != null) obsAfterLogoutIMServer.update(null, null); } }); // 【3】重置大文件下载管理器 。。。。。。。 }
/** * 退出IM服务器连接并释放IM所占的所有资源(含退出IM框架连接、再释放IM框架所占的资源)。 * <p> * 在切换账号等功能场景下,使用本方法可以保证重新登陆时IM框架 * 已回到重初状态,从而完全正常的重新登陆。 * * @see LocalDataSender#sendLoginout() * @see IMClientManager#releaseMobileIMSDK() */ public static void doLogoutIMServer(final Context context, final Observer obsForSucess) { // 退出登陆 new AsyncTask<Object, Integer, Integer>(){ private Observer obsForSucess = null; @Override protected Integer doInBackground(Object... params) { int code = -1; try { if(params != null) obsForSucess = (Observer)params[0]; // local user info 为空即意味着用户极是打开了登陆界面而尚未有登陆过,那当然就不需要退出登陆罗 if(MyApplication.getInstance(context).getIMClientManager().getLocalUserInfo() != null) code = LocalDataSender.getInstance().sendLoginout(); } catch (Exception e) { Log.e(TAG, "错误发生于doLogout:sendLoginout时:"+e.getMessage(), e); } return code; } @Override protected void onPostExecute(Integer code) { // local user info 为空即意味着用户极是打开了登陆界面而尚未有登陆过,那当然就不需要退出登陆罗 if(MyApplication.getInstance(context).getIMClientManager().getLocalUserInfo() != null) { if(code == 0) Log.d(LoginActivity.class.getSimpleName(), "注销登陆请求已成功发出!"); else Log.w(LoginActivity.class.getSimpleName(), "注销登陆请求发送失败。错误码是:"+code+"!"); } try { // 释放IM所占资源 MyApplication.getInstance(context).getIMClientManager().releaseMobileIMSDK(); } catch (Exception e) { Log.e(TAG, "错误发生于logoutMobileIMSDK:onPostExecute:releaseMobileIMSDK()时:"+e.getMessage(), e); } // * 处理完成后通知观察者做其它事哦 if(obsForSucess != null) obsForSucess.update(null, null); } }.execute(obsForSucess);
/** * 释放IM框架所占用的资源,在退出登陆时请务必调用本方法,否则重 * 新登陆将不能正常实现(指APP进程不退出时切换账号这种情况)。 */ public void releaseMobileIMSDK() { // 释放IM核心库资源 ClientCoreSDK.getInstance().release(); // 重置本类的初始化标识 this.resetInitFlag(); // 清空设置的回调 ClientCoreSDK.getInstance().setChatBaseEvent(null); ClientCoreSDK.getInstance().setChatMessageEvent(null); ClientCoreSDK.getInstance().setMessageQoSEvent(null); // 清空本量中的关键全局变量 this.localUserInfo = null; this.currentFrontGroupChattingGroupID = null; this.currentFrontTempChattingUserUID = null; this.currentFrontChattingUserUID = null; // 重置关键数据模型变量 this.friendsListProvider = null; this.groupsProvider = null; this.messagesProvider = null; this.groupsMessagesProvider = null; this.alarmsProvider = null; this.currentVideoChattingActivity = null; ProhibitSpeechCheckerProvider.getInstance().clear(); // 释放实时音视频相关资源 VVP2PProvider.getInstance(context).release(); }
/** * 打开LoginActivity的Intent构造方法. 此方法通常用于无法普通地打开登陆界面的场景. * * @param thisActivity * @return */ public static Intent createLoginIntent(Context thisActivity) { // init MobileIMSDK first(必须保证此代码被调用,否则IM框架无法完成IM服务器的连接等工作) // 通常在打开登陆界面调用此方法,是合理的,因为它下一步就是登陆im框架啊 MyApplication.getInstance(thisActivity).getIMClientManager().initMobileIMSDK(); Intent intent = new Intent(thisActivity, LoginActivity.class); return intent; }
/** * IM框架初始化方法,本方法在连接IM服务器前必须被调用1次,否则IM底层框架将无法工作。 */ public void initMobileIMSDK() { if(!this._init) { baseEventListener = new ChatBaseEventListener(context); transDataListener = new ChatMessageEventListener(context); messageQoSListener = new MessageQoSListener(context); ClientCoreSDK.getInstance().init(context); ClientCoreSDK.getInstance().setChatBaseEvent(baseEventListener); ClientCoreSDK.getInstance().setChatMessageEvent(transDataListener); ClientCoreSDK.getInstance().setMessageQoSEvent(messageQoSListener); // ClientCoreSDK.DEBUG = true; friendsListProvider = new FriendsListProvider(); groupsProvider = new GroupsProvider(); messagesProvider = new MessagesProvider(); groupsMessagesProvider = new GroupsMessagesProvider(); alarmsProvider = new AlarmsProvider(this.context); this._init = true; } }
引用:JackJiang 发表于 2020-09-24 13:40 好,我来把RainbowChat中的“退出登陆”这个功能的主要实现代码,发你参一下,具体如果你不太理解功能是 ...
引用:暄落 发表于 2020-09-24 13:58 新进展是我这边连接github 项目中的 MobileIMSDK-master\demo_binary\Server\MobileIMSDKServerDemo_de ...
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.140625 second(s), 36 queries , Gzip On.