默认
发表评论 7
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已解决] MobileIMSDK 退出登录后再重新登录的问题
阅读(48813) | 评论(7 收藏 淘帖1
问题描述:  退出登录   如果不是退出整个app,而是返回到登录页面 , 再登录的话就会报:“数据发送失败 错误码 203”
下面是我 在demo处改动的代码:
1.增加MyApplication:
public class MyApplication extends Application {
@Override
public void onCreate() {
  // TODO Auto-generated method stub
  super.onCreate();
  // 确保MobileIMSDK被初始化哦(整个APP生生命周期中只需调用一次哦)
  IMClientManager.getInstance(this).initMobileIMSDK();
}
}


2.取消登录页面的mobileIMSDK的初始化: LoginActivity->onCreate
@Override
protected void onCreate(Bundle savedInstanceState)
{
  super.onCreate(savedInstanceState);
  
  //
  this.setContentView(R.layout.demo_login_activity_layout);
  
  // 界面UI基本设置
  initViews();
  initListeners();
  
//  // 确保MobileIMSDK被初始化哦(整个APP生生命周期中只需调用一次哦)
//  IMClientManager.getInstance(this).initMobileIMSDK();
  
  // 登陆有关的初始化工作
  initForLogin();
}


3.登录成功处取消掉结束登录页面:LoginActivity->initForLogin()
onLoginSucessObserver = new Observer(){
   @Override
   public void update(Observable observable, Object data)
   {
    // * 已收到服务端登陆反馈则当然应立即取消显示登陆进度条
    onLoginProgress.showProgressing(false);
    // 服务端返回的登陆结果值
    int code = (Integer)data;
    // 登陆成功
    if(code == 0)
    {
     //** 提示:登陆/连接 MobileIMSDK服务器成功后的事情在此实现即可
     
     // 进入主界面
     startActivity(new Intent(LoginActivity.this, MainActivity.class));
     // 同时关闭登陆界面
//     finish();
    }
    // 登陆失败
    else
    {
     new AlertDialog.Builder(LoginActivity.this)
      .setTitle("友情提示")  
      .setMessage("Sorry,IM服务器连接失败,错误码="+code)
      .setPositiveButton("知道了", null)
    .show();
    }
   }
  };


4.发送消息页面 取消结束整个app:MainActivity->doExit()
private void doExit()
{
  finish();
//  System.exit(0);
}


5.最后在AndroidManifest里面的application添加MyAppclication
  <application
       android:name="net.openmob.mobileimsdk.android.demo.MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

6.步骤重现:点击登录,进入到发送消息页面 然后按返回键<里面有退出登录的方法>,回到登录页面后再点击登录 就会出现 :发送数据错误 错误码203!  

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

标签:MobileIMSDK
上一篇:[已回复] 求教MobileIMSDK的UDP传输过程中头部的大小下一篇:[已回复] 关于MobileIMSDK里的msgId生成疑问

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

推荐方案
评论 7
都已经按上面的操作了,报错
【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:784)
2024-05-27 13:51:10.835 10925-11172 LocalDataSender         com.linkcircle.cs.demo               W  【IMCORE-TCP】[来自Netty的连接结果回调观察者通知]socket连接失败,本次登陆信息未成功发出!
问题已解决:这是Demo代码中少调用了一行代码而已(即在退出登陆时没有重置IMClientManager里的init为false),请取github上最新的demo代码,比对下,很简单的问题!

另外,统一参考这个帖子《 [已回复] 求助MobileIMSDK 退出登录再重新登录后出现203错误
引用:Jellal 发表于 2017-07-11 17:00
还是不好使!

重新登陆的完整逻辑代码贴出来
引用:JackJiang 发表于 2017-07-11 15:32
ok,那就看看你错误码,是203,即表示“客户端未初始化”:
那你应该在重新登陆时再把 IMClientManager. ...

还是不好使!
引用:Jellal 发表于 2017-07-11 15:23
我看到源码的退出登录:LocalUDPDataSender.getInstance(SelfMatchActivity.this).sendLoginout();这个方 ...

ok,那就看看你错误码,是203,即表示“客户端未初始化”
那你应该在重新登陆时再把 IMClientManager.getInstance(this).initMobileIMSDK(); 调用一次,正常情况:即在不退出app重新登陆的情况下,是不需要再次调用,但release()后,想再次使用那一定要成对的调用init,你看看源码。
引用:JackJiang 发表于 2017-07-11 14:42
你在退出登陆时,需要调用一下 IMClientManager.getInstance(this).release()(实际上相当于直接调用Client ...

我看到源码的退出登录:LocalUDPDataSender.getInstance(SelfMatchActivity.this).sendLoginout();这个方法其实是调用了
   public int sendLoginout() {
        int code = 0;
        if(ClientCoreSDK.getInstance().isLoginHasInit()) {
            byte[] b = ProtocalFactory.createPLoginoutInfo(ClientCoreSDK.getInstance().getCurrentLoginUserId()).toBytes();
            code = this.send(b, b.length);
        }

        ClientCoreSDK.getInstance().release();        return code;
    }

这个方法的 ClientCoreSDK.getInstance().release();        
你在退出登陆时,需要调用一下 IMClientManager.getInstance(this).release()(实际上相当于直接调用ClientCoreSDK.getInstance().release();),这样才算真正退出IM,有做这个调用吗?没有做,那你就应该补上
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部