是否有可能加快在Activity子类中初始化AlertDialogs?

时间:2012-08-22 06:26:08

标签: java android android-activity alertdialog builder

我知道创建静态方法来创建AlertDialogs并不是一个好兆头。但是,每当我想创建一些AlertDialogs时,我总是要将它们放在一个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());
}

这不是我想要的。我尝试将它们放在一个新的线程中运行,但它泄漏了内存,所以它不起作用。此外,由于问题(Static AlertDialog方法会泄漏内存等),我只是没有任何其他想法来解决这个问题。

我不知道接下来该做什么。那么,请问,还有谁有更好的方法来初始化AlertDialogs而不牺牲性能速度?提前谢谢。

1 个答案:

答案 0 :(得分:1)

我要做的第一件事是添加一些性能分析工具(测量)来确定代码花费时间的位置。没有什么比花时间尝试优化不需要优化的东西更痛苦了; - )

从这看起来,我可以看到至少一个简单的优化:这个代码创建了6个不同的匿名类的6个实例,只是为了处理onClick()回调。恕我直言,这是没有必要的。您可以使用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...
    }
}

我不能保证这会提高性能,但它肯定会让垃圾收集器非常高兴: - )