重启TabGroup崩溃,我在我的Android 2.0.2钛GA移动应用经历了暴跌,其中重开一个选项卡组与一个NullPointerException崩溃。钛 - 在Android的
这些症状与我发现的这些Jira非常相似,但是我已经在那些Jiras中测试了测试代码,并且它不会崩溃,但是,每测试一次,我的代码就会崩溃。
- http://developer.appcelerator.com/question/131195/reopen-tabgroup-causes-activity-reference-is-invalid-removing-from-activity-stack-nullpointerexception
- https://jira.appcelerator.org/browse/TIMOB-7573
- https://jira.appcelerator.org/browse/TIMOB-7240
- https://jira.appcelerator.org/browse/TIMOB-7572
我已确认的是,上述jiras,使用所提供的测试代码,确实固定。
我的应用程序是模块(邮件,联系人,地图和日历)的集合,并且每个模块被配置成阵列。然后,应用程序将从数组中创建模块,并将返回的窗口对象存储在另一个数组中,该数组将在构建图标主屏幕时处理。点击主屏幕上的图标打开该模块的窗口。
当你点击联系人模块 - 唯一一个有tabgroup,应用程序打开tabgroup,但如果你回到主屏幕,然后再次点击联系人,它崩溃。
例外如下:
[DEBUG][AndroidRuntime( 345)] Shutting down VM
[WARN][dalvikvm( 345)] threadid=1: thread exiting with uncaught exception (group=0x4001d800)
[ERROR][TiApplication( 345)] (main) [1551,84953] Sending event: exception on thread: main msg:java.lang.NullPointerException; Titanium 2.0.2,2012/05/30 10:21,2ff31a3
[ERROR][TiApplication( 345)] java.lang.NullPointerException
[ERROR][TiApplication( 345)] at android.content.ComponentName.<init>(ComponentName.java:75)
[ERROR][TiApplication( 345)] at android.content.Intent.<init>(Intent.java:2678)
[ERROR][TiApplication( 345)] at ti.modules.titanium.ui.TabGroupProxy.handleOpen(TabGroupProxy.java:293)
[ERROR][TiApplication( 345)] at org.appcelerator.titanium.proxy.TiWindowProxy.handleMessage(TiWindowProxy.java:100)
[ERROR][TiApplication( 345)] at ti.modules.titanium.ui.TabGroupProxy.handleMessage(TabGroupProxy.java:104)
[ERROR][TiApplication( 345)] at android.os.Handler.dispatchMessage(Handler.java:95)
[ERROR][TiApplication( 345)] at android.os.Looper.loop(Looper.java:123)
[ERROR][TiApplication( 345)] at android.app.ActivityThread.main(ActivityThread.java:4627)
[ERROR][TiApplication( 345)] at java.lang.reflect.Method.invokeNative(Native Method)
[ERROR][TiApplication( 345)] at java.lang.reflect.Method.invoke(Method.java:521)
[ERROR][TiApplication( 345)] at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
[ERROR][TiApplication( 345)] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
[ERROR][TiApplication( 345)] at dalvik.system.NativeStart.main(Native Method)
[ERROR][AndroidRuntime( 345)] FATAL EXCEPTION: main
[ERROR][AndroidRuntime( 345)] java.lang.NullPointerException
[ERROR][AndroidRuntime( 345)] at android.content.ComponentName.<init>(ComponentName.java:75)
[ERROR][AndroidRuntime( 345)] at android.content.Intent.<init>(Intent.java:2678)
[ERROR][AndroidRuntime( 345)] at ti.modules.titanium.ui.TabGroupProxy.handleOpen(TabGroupProxy.java:293)
[ERROR][AndroidRuntime( 345)] at org.appcelerator.titanium.proxy.TiWindowProxy.handleMessage(TiWindowProxy.java:100)
[ERROR][AndroidRuntime( 345)] at ti.modules.titanium.ui.TabGroupProxy.handleMessage(TabGroupProxy.java:104)
[ERROR][AndroidRuntime( 345)] at android.os.Handler.dispatchMessage(Handler.java:95)
[ERROR][AndroidRuntime( 345)] at android.os.Looper.loop(Looper.java:123)
[ERROR][AndroidRuntime( 345)] at android.app.ActivityThread.main(ActivityThread.java:4627)
[ERROR][AndroidRuntime( 345)] at java.lang.reflect.Method.invokeNative(Native Method)
[ERROR][AndroidRuntime( 345)] at java.lang.reflect.Method.invoke(Method.java:521)
[ERROR][AndroidRuntime( 345)] at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
[ERROR][AndroidRuntime( 345)] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
[ERROR][AndroidRuntime( 345)] at dalvik.system.NativeStart.main(Native Method)
[WARN][ActivityManager( 62)] Force finishing activity au.edu.csu.mobile/org.appcelerator.titanium.TiActivity
[WARN][ActivityManager( 62)] Activity pause timeout for HistoryRecord{45126978 au.edu.csu.mobile/org.appcelerator.titanium.TiActivity}
[INFO][Process ( 345)] Sending signal. PID: 345 SIG: 9
[INFO][ActivityManager( 62)] Process au.edu.csu.mobile (pid 345) has died.
[INFO][WindowManager( 62)] WIN DEATH: Window{4512a1f8 au.edu.csu.mobile/org.appcelerator.titanium.TiActivity paused=false}
[WARN][ActivityManager( 62)] Activity destroy timeout for HistoryRecord{45126978 au.edu.csu.mobile/org.appcelerator.titanium.TiActivity}
我想我已经将范围缩小到无论是在TI的Code或如何我打电话给我的TabGroup窗口仍然存在bug,因为我已经减少了我的代码最起码的,最简单的tabgroup可以想见......
我的经验是,有一个基本的按钮来关闭tabgroup,它不会崩溃。我可以关闭并重新打开我的心中的内容选项卡组。 Hoever,如果我使用Android后退按钮,然后重新打开标签组,这是它崩溃的时间。我注意到(你可以在下面的代码中看到)选项卡组的背景颜色设置为蓝色,但第二次重新打开它(当然使用关闭按钮后)背景更改为黑色...
,设置了每一个模块的代码是在这里:
csu.module.moduleManager = {};
// Loop through the list of modules and include the
// main modulename.js file if enabled.
var modules = csu.modules;
var config = csu.config;
for (var i = 0; i < modules.length; i++) {
var _module = modules[i];
if (_module.enabled) {
Ti.include(config.moduleBasePath + _module.name + "/" + _module.name + '.js');
csu.module.moduleManager[_module.name] = createModuleWindow(_module.name);
Ti.API.debug('Adding module: [' + _module.name + ']');
}
}
function createModuleWindow(moduleName) {
var window = csu.module[moduleName].createMainWindow();
return window;
};
前述则CreateMainWindow()函数是在这里:
csu.module.contacts = {};
csu.module.contacts.createMainWindow = function() {
var tabGroup = Ti.UI.createTabGroup();
var tabWin = Ti.UI.createWindow({
exitOnClose: false,
title: 'blue',
backgroundColor: 'blue'
});
var tabButton = Ti.UI.createButton({
title: 'close'
});
var tab = Ti.UI.createTab({
title: 'blue',
window: tabWin
});
tabWin.add(tabButton);
tabButton.addEventListener('click', function(e){
tabGroup.close();
});
var label = Ti.UI.createLabel({
text: 'I am a tabgroup',
top: 20
});
tabWin.add(label);
tabGroup.addTab(tab);
tabGroup.name = 'Contacts_Main_Window';
return tabGroup;
};
和代码来打开tabgroup这里:
menuItem.addEventListener('click', function(e) {
var moduleWindow = csu.module.moduleManager[module.name];
Ti.API.debug(moduleWindow);
// If the module requires login and we're not logged in, stop them!
if (module.verifyLogin && csu.app.session.isValidSession()) {
moduleWindow.open();
} else if (!module.verifyLogin) {
Ti.API.debug('Opening Module Window: ' + module.name);
Ti.API.debug('Module Name: ' + moduleWindow.name);
moduleWindow.open();
Ti.API.debug('Module Opened');
} else {
// Not logged in...
var loginAlert = Ti.UI.createAlertDialog({
buttonNames: ['OK', 'Settings'],
cancel: 0,
message: 'You must be logged in to access this section.'
});
loginAlert.addEventListener('click', function (e) {
if (e.cancel === e.index || e.cancel === true) {
return;
}
switch (e.index) {
case 1:
var settingsWindow = csu.ui.createLoginDetailsPane();
settingsWindow.open({modal: true});
break;
default:
break;
}
});
loginAlert.show();
}
});
一些截图来说明场景:
- 主屏幕:再次http://i.imgur.com/QKfryl.png
- 崩溃按下后退按钮后,再联系方式:再次http://i.imgur.com/Db2HDl.png
- 单击关闭之后再联系方式:http://i.imgur.com/weGcll.png
我检查过窗口对象在重新打开时仍然存在,我确认自定义参数仍然存在,除此之外,我卡住了。
这个问题在过去的3天里一直让我走上困境,我真的需要解决它。如果任何人有任何见解:
- 什么可能导致此,
- 如何解决它
- 或者至少;错误堆栈跟踪的组件和意图部分可能涉及的内容
将受到大量赞赏。
更新:我已经尝试了建议的解决方法,但仍然出现崩溃。简单的tabgroup测试我只有一个标签。当我添加第二个选项卡时,转到该选项卡,然后按下硬件返回按钮,然后返回到联系人,它崩溃。
你的意思是硬件后扣? – 2012-07-30 07:20:10
是的,硬件按钮 – Cyntech 2012-07-30 11:04:16
我不知道可能是什么原因,但试图关闭你的窗口上按钮按下'Titanium.UI.currentWindow.addEventListener('android:back',函数(e) { Ti .API.info('后退按钮'); currentWindow.close(); });' – 2012-07-30 11:06:40