2

AlertDialogsを作成するための静的メソッドを作成することは良い兆候ではないことを私は知っています。ただし、AlertDialogを作成したい場合は、常にそれらをActivityサブクラス内に配置する必要があります。私はSOを探し回っており、コードを因数分解するための良い方法を見つけようとしています。これにより、ActivityサブクラスからAlertDialogsを初期化して作成する必要がなくなります。

これは私のコードの例であり、AlertDialogsのパフォーマンス速度を犠牲にしなければならないように設計されています。これは私のプロジェクト計画で非常に必要です。

public void onCreate(Bundle b) {
    super.onCreate(b);
    accelerometer = new Accelero();
    leaderboard = new Score(this);
    renderView = new RenderView(this);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(renderView);

    // TODO: Refactor this, to speed things up.
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    input = new EditText(this);
    builder.setView(input);
    builder.setTitle("Enter Name for High Score!");
    builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            // TODO: Polish the dialog.
            // TODO: Add a method of obtaining the score from RenderView.
            renderView.getStage().reset();
            renderView.setDialogFlag(false);
        }
    });
    builder.setNegativeButton("Back", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            PlayActivity.this.onBackPressed();
        }
    });
    renderView.setLosingDialog(builder.create());
    builder = new AlertDialog.Builder(this);
    builder.setTitle("You win!");
    builder.setPositiveButton("Next Stage", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            renderView.createStage(getAssets(), stageNumber);
            renderView.pauseGame();
        }
    });
    renderView.setWinningDialog(builder.create());
    builder = new AlertDialog.Builder(this);
    builder.setTitle("Game Paused!");
    builder.setPositiveButton("Back to Game", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            renderView.unpauseGame();
        }
    });
    builder.setNeutralButton("Restart", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            renderView.resetGame();
        }
    });
    builder.setNegativeButton("Main Menu", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            // TODO: Will probably improve some more on this.
            PlayActivity.this.finish();
        }
    });
    renderView.setPausingDialog(builder.create());
}

これは私が望んでいたことではありません。それらを新しいスレッドに配置して実行しようとしましたが、メモリリークが発生したため、機能しませんでした。また、問題(静的AlertDialogメソッドはメモリリークなど)のため、これを修正するための他のアイデアはありません。

次に何をしたらいいのかわからない。では、パフォーマンス速度を犠牲にすることなくAlertDialogsを初期化するためのより良い方法を他に誰が持っているのでしょうか?前もって感謝します。

4

1 に答える 1

1

最初に行うことは、パフォーマンス分析インストルメンテーション(測定)を追加して、コードが時間を費やしている場所を特定することです。最適化を必要としないものを最適化するために時間を費やすことほど苦痛なことはありません;-)

これを見ると、少なくとも1つの簡単な最適化がわかります。このコードは、onClick()コールバックを処理するためだけに、6つの異なる匿名クラスの6つのインスタンスを作成します。必要のない私見。thisコールバックインターフェイスとして使用し、アクティビティがを実装していることを確認できますDialogInterface.OnClickListener。次に、すべてのクリックイベントを処理する単一のメソッドをアクティビティに記述します。

public void onClick(DialogInterface dialog, int which) {
    if (dialog == renderView.getLosingDialog()) {
        if (which == DialogInterface.BUTTON_POSITIVE) {
            // TODO: Polish the dialog.
            // TODO: Add a method of obtaining the score from RenderView.
            renderView.getStage().reset();
            renderView.setDialogFlag(false);
        } else if (which == DialogInterface.BUTTON_NEGATIVE) {
            PlayActivity.this.onBackPressed();
        }
    } else if dialog == renderView.getWinningDialog()) {
        // etc...
    } else if dialog == renderView.getPausingDialog()) {
        // etc...
    }
}

これによってパフォーマンスが向上することを保証することはできませんが、ガベージコレクターを非常に満足させることは間違いありません:-)

于 2012-08-22T11:05:13.260 に答える