Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以加快初始化活动子类中的AlertDialogs?_Java_Android_Android Activity_Android Alertdialog_Builder - Fatal编程技术网

Java 是否可以加快初始化活动子类中的AlertDialogs?

Java 是否可以加快初始化活动子类中的AlertDialogs?,java,android,android-activity,android-alertdialog,builder,Java,Android,Android Activity,Android Alertdialog,Builder,我知道创建静态方法来创建AlertDialogs不是一个好迹象。但是,每当我想创建一些AlertDialogs时,我总是必须将它们放在活动子类中。我一直在寻找一种很好的方法来分解代码,这样我就不必从Activity子类初始化和创建AlertDialogs 下面是我的代码示例,其设计方式使我不得不牺牲AlertDialogs的性能速度,这在我的项目计划中是非常必要的 public void onCreate(Bundle b) { super.onCreate(b); accele

我知道创建静态方法来创建AlertDialogs不是一个好迹象。但是,每当我想创建一些AlertDialogs时,我总是必须将它们放在活动子类中。我一直在寻找一种很好的方法来分解代码,这样我就不必从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?提前感谢。

我要做的第一件事是添加一些性能分析工具(度量),以确定代码在哪里花费时间。没有什么比花时间优化不需要优化的东西更痛苦的了;-)

从这里我可以看到至少一个简单的优化:这段代码创建了6个不同匿名类的6个实例,只是为了处理
onClick()
回调。我想那是没有必要的。您可以只使用
作为回调接口,并确保您的活动实现了
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...
    }
}

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

您确实做过任何计时测量吗?这个方法中使用的时间在哪里?是的,我在问这个问题之前用过。我认为其他开发人员只需浏览一下我的代码,就可以很容易地看出它的速度很慢,所以我没有考虑提供有关计时测量的信息。很抱歉事实证明,当运行上述代码片段时,整个应用程序在Logcat上的速度会降低约0.892秒(通过计算我创建的两条消息之间的差异)。因此,您的意思是,这段代码运行需要0.892秒。从哪条线到哪条线?尝试测量调用
setContentView()
所需的时间。完成!当比较它们时,我似乎在创建一个级别时,它比初始化对话框花费的时间要长得多。该死!我已经关掉了我的笔记本电脑,刚刚在手机上读完这篇文章。这似乎是一个缩短周围事物的好方法。我明天早上去做D