2012-07-30 48 views
2

重启TabGroup崩溃,我在我的Android 2.0.2钛GA移动应用经历了暴跌,其中重开一个选项卡组与一个NullPointerException崩溃。钛 - 在Android的

这些症状与我发现的这些Jira非常相似,但是我已经在那些Jiras中测试了测试代码,并且它不会崩溃,但是,每测试一次,我的代码就会崩溃。

我已确认的是,上述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/Wcu7gl.png
  • 点击联系人后

    我检查过窗口对象在重新打开时仍然存在,我确认自定义参数仍然存在,除此之外,我卡住了。

    这个问题在过去的3天里一直让我走上困境,我真的需要解决它。如果任何人有任何见解:

    • 什么可能导致此,
    • 如何解决它
    • 或者至少;错误堆栈跟踪的组件和意图部分可能涉及的内容

    将受到大量赞赏。

    更新:我已经尝试了建议的解决方法,但仍然出现崩溃。简单的tabgroup测试我只有一个标签。当我添加第二个选项卡时,转到该选项卡,然后按下硬件返回按钮,然后返回到联系人,它崩溃。

  • +0

    你的意思是硬件后扣? – 2012-07-30 07:20:10

    +0

    是的,硬件按钮 – Cyntech 2012-07-30 11:04:16

    +0

    我不知道可能是什么原因,但试图关闭你的窗口上按钮按下'Titanium.UI.currentWindow.addEventListener('android:back',函数(e) { Ti .API.info('后退按钮'); currentWindow.close(); });' – 2012-07-30 11:06:40

    回答

    0

    IIRC,你只能在android上有一个tabgroup?自从我在TI上触摸android上的tabgroups已经很长时间了。

    +0

    我只有一个tabgroup。 – Cyntech 2012-07-30 23:58:02