1

最近、アプリケーションの 1 つでメモリ分析を行っています。アプリケーションは、Android プラットフォーム用に作成されています。2 つの画面で、リークがあることを確認しています。

検証はありません。すべてのコードを削除し、両方のコントローラーで $.screenName.open() 呼び出しのみを保持しました。それらを呼び出す方法は次のとおりです。

Alloy.createController(screenToLaunch, payloadJson);

それぞれのコントローラー内には、open() 呼び出しがありました。DDMS を使用してヒープ分析を行います。

コントローラ A を開く前に、原因 GC を数回押して、安定した割り当てられた読み取り値を取得しました。完了したら、コントローラー A を起動し、戻るボタンを押して閉じます。原因GCを数回クリックすると、毎回60KBの違いがあります。

createController 参照をグローバル変数に保存していません。なぜそれがそのような方法で動作しているのかについての考えはありますか?

更新日: HPROF の違い

上記は、コントローラの開閉の HPROF 差です。私は DB 呼び出しを使用していませんが、多くの DB 関連の呼び出しが行われていることがわかります。フレームワークが内部機能のためにこれらの呼び出しを使用している可能性があると思います。

4

2 に答える 2

0

私はこのアーキテクチャをコントローラー (UI.Windows) に使用しており、非常にうまく機能します。

  • ウィンドウを開く: Alloy.createController('name_controller').getView().open();

Alloy コントローラーのクリーンアップ

于 2016-05-05T20:51:43.137 に答える
0

これは、すべてのコントローラーとウィジェットのクリーンアップ方法です。

someview.js

var args = arguments[0] || {},
    data = {};

data.button = Alloy.createController('button',{
    title:'button'
}).getView();

 $.view.cleanup = function() {

    $.destroy();

    $.off();

    data.button.cleanup();

    $ = data = args = null;
};

ボタン.js

var args = arguments[0] || {},
    data = {};

data.click = function() { ... };

$.view.addEventListener('click',data.click);

$.view.cleanup  = function() {

    $.destroy();

    $.off();

    $.view.removeEventListener('click',data.click);

    $ = data = args = null;
};

cleanup メソッドを呼び出して、コントローラーのすべての子のコンテンツを削除するグローバル関数を作成しました。

アップデート

delete 演算子と try ステートメントを追加

exports.unset = function(view) {

    if(view) {

        if(view.children && view.children.length) {

            for(var i in view.children) try { util.unset(view.children[i]);
            } catch(e) {}

            view.removeAllChildren();
        }

        if(view.views && view.views.length) for(var i = view.views.length; i > 0; i--) if(view.views[i-1]) {

            if(view.removeView) view.removeView(i-1);

            try { util.unset(view.views[i-1]);
            } catch(e) {}
        }

        if(view.cleanup) try { view.cleanup();
        } catch(e) {}

        view = null;

        delete view;
    }
};
于 2016-05-06T08:16:49.893 に答える