我自己用java实现了一套热更新的机制,正常情况下是没有任何问题的。
但是当接入了SDK后就出现了问题。
我首先描述下我热更新的基本交互。
在java端,我用线程池来维护下载
在lua端,我注册了一个局部函数到java中
java端通过
public static void dispatchEvent(final Event event) {
if (luaFunctionId < 0)
return;
Utils.act.runOnGLThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
String value = JSON.toJSONString(event);
Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaFunctionId,
value);
}
});
}
这段代码来通知lua端,这个luaFunctionId就是lua注册到java中的;
而对于java端通知给lua的消息,lua端做的处理大多数是更新界面,例如进度条,文件下载大小等等。
问题出现的环境:
接入华为的一个SDK后,该SDK在主activity的oncreate函数中,会初始化该SDK,如果发现设备没有安装华为游戏中心,则会跳转到安装界面,安装完成后,回到游戏就报错了
Performing pause of activity that is not resumed
但是当本设备拥有华为应用中心的时候,也就是说,进入游戏后,不用跳转出去。这种情况是不会出问题的。
我的理解:
那么基于这种情况,我猜测可能是应为,当跳转到安装华为游戏中心界面的时候,游戏的主activity已经进入后台,但是因为线程池的下载仍在继续,所以不断的会调用上面的
dispatchEvent
``
函数,而Utils.act此时已经进入后台,调用其的话是否就会造成报错?
不过我对此又做过一个实验,在不安装任何sdk的情况下,当处于热更的时候,我将应用切入后台,切回之后,仍然是正确的。
这是不是说明了,即使游戏的主activity处于后台,仍然是可以调用它的runOnGLThread呢?
如果可以,那么为什么会出现报错的情况?
请先不要和我讨论为什么不用自带热更新的问题,谢谢