最近项目遇到一个需求,就是在登录状态的时候。才能接收到消息。所有我在上线,下线状态的时候。做了MQTT断开和连接的动作。然后就是发生了。我们标题的这关键点了。直接报错了。报错的内容如下:
MqttAndroidClient unregisterRecevicer after disconnect throw missing call unregisterRecevicer...
直接报错了。跟剧情完全不一样啊,但是好奇怪。之前是页面销毁就不会报这个错误。之前是退出登录的时候。页面顺带一起销毁Service的。就没问题。然后现在是页面还在。但是给执行Service的绑定和解绑动作的时候就会出现问题。
如果你依赖的也是下面的这个,那么这个帖子应该有希望会帮到你:
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
/*** 开启service*/public static void startService(Context context) {mqttSetUp = null;TOPIC = UUID_PREFIX + SharedCacheUtils.getInstance(context).getUUid();if (context != null) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {context.startForegroundService(new Intent(context.getApplicationContext(), MQTTService.class));} else {context.startService(new Intent(context.getApplicationContext(), MQTTService.class));}}}
/*** 关闭service*/public static void stopService(Context context) {if (context != null) {context.stopService(new Intent(context.getApplicationContext(), MQTTService.class));} else {// 如果异常关闭,导致UI关闭,服务没解绑。走elsetry {if (client != null) {client.unregisterResources();client.close();client.disconnect(0);client.setCallback(null);}client = null;} catch (Exception e) {e.printStackTrace();}}}
这个是我之前的代码,然后我就去查找这个问题的解决思路,然后就发现了很多帖子的作者也遇到了这个问题。报错信息是一样的。但是好像没有解决我的问题。离谱的是,我搜到了好多VIP的帖子。我看不了。哈哈哈。没有分享精神啊!差评。
然后我就去该依赖的报错反馈信息里面找找看。果然有,但是很多都是建议。能不能用还得靠自己实践了才知道有没有帮助。我发现很多帖子都有点像是AI的,很不靠谱。后面通过自己实践之后就解决了,解决方案如下:
/*** 关闭service*/public static void stopService(Context context) {if (context != null) {context.stopService(new Intent(context.getApplicationContext(), MQTTService.class));} else {// 如果异常关闭,导致UI关闭,服务没解绑。走elsetry {if (client != null) {client.unregisterResources();client.close();//client.disconnect(0);client.setCallback(null);}client = null;} catch (Exception e) {e.printStackTrace();}}}
注释disconnect的动作。就不会报错了。如果你有更好的解决方式,欢迎评论哦!下面就是解决方法的出处。希望能帮助到你。
https://github.com/eclipse-paho/paho.mqtt.android/issues/212