默认
发表评论 7
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] MobileIMSDK的Android IM登录,调用sendLoginout后,重新登录不了,报错
Android IM登录,调用sendLoginout后,重新登录不了。报错

IMCORE-tryConnectToHost-异步回调】连接失败,原因是:
                                                                                                    java.lang.IllegalStateException: executor not accepting a task
                                                                                                        at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
                                                                                                        at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:194)
                                                                                                        at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
                                                                                                        at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:180)
                                                                                                        at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:166)
                                                                                                        at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:577)
                                                                                                        at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:551)
                                                                                                        at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:490)
                                                                                                        at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:615)
                                                                                                        at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:604)
                                                                                                        at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
                                                                                                        at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
                                                                                                        at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:984)
                                                                                                        at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:504)
                                                                                                        at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:417)
                                                                                                        at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:474)
                                                                                                        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
                                                                                                        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
                                                                                                        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
                                                                                                        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
                                                                                                        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
                                                                                                        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
                                                                                                        at java.lang.Thread.run(Thread.java:764)
2024-05-23 11:01:12.913  5457-5528  LocalDataSender         com.linkcircle.cs.demo               W  【IMCORE-TCP[来自Netty的连接结果回调观察者通知socket连接失败,本次登陆信息未成功发出!


即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:[已回复] 求教基于MobileIMSDK的WebSocket,移动端得消息没有及时显示下一篇:[已回复] 用MobileIMSDK demo写的im群组换成自己的域名和端口,无法连接

本帖已收录至以下技术专辑

推荐方案
评论 7
退出登陆后,要应该像Demo里一样调用 IMClientManager. release().

再次登陆前,那就必须要重新调用IMClientManager. initMobileIMSDK(),这调用逻辑必须是成对出现的:
WX20240523-144824@2x.png
是的,登陆前有重新调用了ClientCoreSDK.getInstance().init()方法
引用:jybin88 发表于 2024-05-23 16:03
是的,登陆前有重新调用了ClientCoreSDK.getInstance().init()方法

那就百度一下这行log吧:java.lang.IllegalStateException: executor not accepting a task
找到了下面这个回复:
netty executor not accepting a task
Netty是一个基于NIO的客户端-服务器框架,它非常适合高并发的网络应用程序。在使用Netty的过程中,有时候会遇到"executor not accepting a task"的错误。

这个错误通常出现在你的应用程序尝试提交一个任务到Netty的执行器(executor)中,但执行器由于某种原因无法接受该任务。这可能是由于执行器已经关闭、线程池已满或任务队列已满等原因。

为了解决这个问题,你可以尝试以下步骤:

检查执行器的状态:比如执行器是否已经关闭,如果已经关闭则需要重新创建一个执行器。

调整执行器的线程池大小:如果线程池太小,会导致无法处理所有的任务,可以增加线程池的大小。

调整任务队列的大小:如果任务队列太小,会导致任务无法排队等待执行,也可能导致执行器无法接收所有任务。增加任务队列的大小也可能有助于解决这个问题。


是不是logout的时候什么没有释放干净。
释放是参考demo的这种写法
public void doLogout() {
                // 发出退出登陆请求包(Android系统要求必须要在独立的线程中发送哦)
                new MBAsyncTask() {
                        @Override
                        protected Integer doInBackground(Object... params) {
                                int code = -1;
                                try{
                                        code = LocalDataSender.getInstance().sendLoginout();
                                } catch (Exception e){
                                        Log.w(TAG, e);
                                }
                               
                                //## BUG FIX: 20170713 START by JackJiang
                                // 退出登陆时记得一定要调用此行,不然不退出APP的情况下再登陆时会报 code=203错误哦!
                                IMClientManager.getInstance(MainActivity.this).resetInitFlag();
                                //## BUG FIX: 20170713 END by JackJiang
                               
                                return code;
                        }

                        @Override
                        protected void onPostExecute(Integer code) {
                                refreshMyid();
                                if(code == 0)
                                        Log.d(TAG, "注销登陆请求已完成!");
                                else
                                        Toast.makeText(getApplicationContext(), "注销登陆请求发送失败。错误码是:"+code+"!", Toast.LENGTH_SHORT).show();
                        }
                }.execute();
        }
关键问题是,doLogout你是在哪里调用的,怎么调用的
点击页面上的按钮调用。调用方法如下
private void imLogout() {
        if (ClientCoreSDK.getInstance().isInitialed()) {
            ClientCoreSDK.getInstance().setChatBaseEvent(null);
            ClientCoreSDK.getInstance().setMessageQoSEvent(null);
            ClientCoreSDK.getInstance().setChatMessageEvent(null);
            new MBAsyncTask() {
                @Override
                protected Integer doInBackground(Object... objects) {
                    int code = -1;
                    try {
                        code = LocalDataSender.getInstance().sendLoginout();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return code;
                }

                @Override
                protected void onPostExecute(Integer code) {
                    if (0 == code) {
                        KLog.d(TAG, "注销登陆请求已完成!");
                    } else {
                        KLog.d(TAG, "注销登陆请求发送失败。错误码是:" + code + "。调用ClientCoreSDK.getInstance().release()释放资源");
                        ClientCoreSDK.getInstance().release();
                    }
                    KLog.d(TAG, "IM登出,需要重新初始化(initIm),并重新登录IM(loginIm)");
                    //登录注销需要发送一个下线消息,通知UI层,IM已经下线
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        socketMessageListeners.forEach(listener -> listener.imOffline(-2));
                    } else {
                        for (final CServiceMessageListener listener : socketMessageListeners) {
                            listener.imOffline(-2);
                        }
                    }
                }
            }.execute();
        } else {
            KLog.d(TAG, "IM未初始化,不进行注销登陆操作");
        }
    }
引用:jybin88 发表于 2024-05-27 17:40
点击页面上的按钮调用。调用方法如下
private void imLogout() {
        if (ClientCoreSDK.getInstanc ...

看起来也没有明显的问题。我也不理解,因为从没遇到过这样的log

你加try catch做好代码健壮性保障,且不要e.printStackTrace();(这一打印就会崩),然后再看看什么情况
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部