2

Android の Titanium 2.0.2 GA モバイル アプリでクラッシュが発生し、タブ グループを再度開くと NullPointerException でクラッシュします。

症状は私が見つけたこれらの Jira と非常によく似ていますが、それらの Jira でテスト コードをテストしましたが、クラッシュしませんでしたが、コードはテストするたびにクラッシュします。

提供されたテスト コードを使用して、上記の jiras が実際に修正されていることを確認しました。

私のアプリケーションはモジュール (メッセージ、連絡先、マップ、およびカレンダー) のコレクションであり、各モジュールは配列に構成されています。次に、アプリは配列からモジュールを作成し、返されたウィンドウ オブジェクトを別の配列に格納します。この配列は、アイコンのホーム画面を構築するときに処理されます。ホーム画面のアイコンをクリックすると、そのモジュールのウィンドウが開きます。

連絡先モジュール (タブグループを持つ唯一のモジュール) をクリックすると、アプリケーションはタブグループを開きますが、ホーム画面に戻って連絡先をもう一度クリックすると、クラッシュします。

例外は次のとおりです。

[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のコードにまだバグがあるか、コードを想像できる最も単純で最も単純なタブグループに減らしたときにTabGroupウィンドウを呼び出す方法に絞り込んだと思います...

私が経験したことは、タブグループを閉じるための基本的なボタンを使用すると、クラッシュしないということです。タブグループを閉じて、心ゆくまで開くことができます。ただし、 Android の戻るボタンを使用してタブグループを再度開くと、クラッシュします。

さらに、(以下のコードで確認できます) タブグループの背景色が青に設定されていることに気付きましたが、2 回目に (もちろん [閉じる] ボタンを使用した後) 再度開くと、背景が黒に変わります...

各モジュールを設定するコードは次のとおりです。

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;
};

タブグループを開くコードは次のとおりです。

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();
    }
});

シナリオを説明するためのいくつかのスクリーンショット:

再度開いたときにウィンドウ オブジェクトがまだ存在することを確認しました。カスタム パラメーターがまだ存在することを確認しました。

この問題は、過去 3 日間、私を壁に追いやっており、本当に解決する必要があります。誰かが洞察を持っている場合:

  • これを引き起こしている可能性のあるものは何ですか、
  • 解決方法
  • または少なくとも; エラー スタック トレースの Component および Intent 部分が参照する可能性のあるもの

大いに感謝します。

更新:提案された回避策を試しましたが、それでもクラッシュします。私が持っている単純なタブグループ テストには、タブが 1 つしかありません。2 番目のタブを追加して、そのタブに移動し、連絡先に戻る前にハードウェアの [戻る] ボタンを押すと、クラッシュします。

4

1 に答える 1

0

IIRC、Androidではタブグループを1つだけ持つことができますか?TIでAndroidのタブグループに触れてから久しぶりです。

于 2012-07-30T20:08:39.577 に答える