我遇到某种可能的竞争条件。
我正在使用onCreateOptionsMenu()在我的活动中创建的选项菜单。
直到最近才开始工作。
在ICS(4.0.4)wifi平板电脑上,这非常有效。我每次都会得到选项菜单。 onCreateOptionsMenu()在onStart()之后立即调用,最后一个片段的onActivityCreated()在onCreate()之后调用。
在JB(4.2.2)4g手机(软件菜单按钮)上,只要WiFi处于活动状态,此功能就会失败。关闭WiFi菜单显示。打开WiFi没有菜单。在onStart()之后,没有onCreateOptionMenu()被调用。
UDPATE: 经过多次测试,这不仅与wifi有关。我可以在JB(4.2.2)上多次启动应用程序,有时它会成功,有时它将无法调用onCreateOptionsMenu()。 当您尝试多次启动应用程序时,这是一个很好的副作用,然后在某些时候,许可将弹出“应用程序未获许可”错误,并且您将陷入困境,直到您从Google Play商店应用程序清除数据,有时必须重启设备。多么痛苦。
我甚至尝试将setHasOptionsMenu(true)放在我的最后一个片段中,即使我没有更改片段中的选项菜单,只是为了尝试强制一个invalidateOptionsMenu,它会导致onCreateOptionsMenu被调用但是所有没有用。
肯定有一些竞争条件正在发生。但是日志没有显示任何内容。
如何强制onCreateOptionsMenu()一致地调用?
答案 0 :(得分:0)
好的,经过多次测试,这都归功于In-App-Billing的异步监听器。 这个听众有时会提早跑,有时会迟到。 监听器中有代码对选项菜单上的项进行了修改。 如果监听器运行得足够早,则选项菜单为空,并且在某些时候应用程序将崩溃。 为了解决这个问题,我确保在创建选项菜单之后才调用侦听器。