【问题标题】:This code causes an Application not responding dialog此代码导致应用程序无响应对话框
【发布时间】:2021-11-18 06:51:06
【问题描述】:

我正在制作西洋跳棋游戏,以下代码导致应用程序在运行时没有响应对话框。如何使代码高效并删除 Anr 对话框。

public void drawPawns() {
        for(int i=0; i<playableTileView.length; i++) {
            if(playableTile[i].getIsTaken() == 1) playableTileView[i].setBackgroundResource(R.drawable.white_pawn);
            else if(playableTile[i].getIsTaken() == -1) playableTileView[i].setBackgroundResource(R.drawable.brown_pawn);
            else if(playableTile[i].getIsTaken() == 2) playableTileView[i].setBackgroundResource(R.drawable.white_queen);
            else if(playableTile[i].getIsTaken() == -2) playableTileView[i].setBackgroundResource(R.drawable.brown_queen);
            else playableTileView[i].setBackgroundResource(0);
        }

【问题讨论】:

    标签: java arrays android-studio for-loop android-anr-dialog


    【解决方案1】:

    检查任何可能的异常,例如抛出的 NullPointerException。检查错误日志。

    【讨论】:

    • 日志中没有 NullPointerException,如果它在哪里,它会导致应用程序崩溃而不是 Anr。
    【解决方案2】:

    playableTileView 有多少个? 如果超过 5,那么您需要使用处理程序,因为 setBackground 是一个 UI 繁重的操作,您也不能在这里使用它的后台线程。也可以查看和存储之前设置的背景,只在需要时设置。

    我假设您已经为所有图像分辨率添加了适当的可绘制对象,特别是 hdpi、xhdpi 和 xxhdpi

    handler.postDelayed(()->{
    if(playableTile[i].getIsTaken() == 1) playableTileView[i].setBackgroundResource(R.drawable.white_pawn);
            else if(playableTile[i].getIsTaken() == -1) playableTileView[i].setBackgroundResource(R.drawable.brown_pawn);
            else if(playableTile[i].getIsTaken() == 2) playableTileView[i].setBackgroundResource(R.drawable.white_queen);
            else if(playableTile[i].getIsTaken() == -2) playableTileView[i].setBackgroundResource(R.drawable.brown_queen);
            else playableTileView[i].setBackgroundResource(0);
    },10); 
    

    【讨论】:

    • 是的,超过 5 次,实际上 forloop 运行了 50 次,因为它检查了 50 个可玩方块
    • 对上述解决方案 ANR 的巨大尝试应该停止。还有一个优化提示将 lastIsTaken 存储在 playableTile 对象中。仅当 playableTile.getIstaken != playbleLastIsTaken 时更新。采用任何第一次不能相同的默认 lastIsTaken 值。
    • 好的,我会这样做并回复你
    • 我刚刚尝试了您的建议,但仍然出现 Anr。您建议的优化提示,如果不对我的代码进行重大更改,我将无法做到这一点。如果您有任何其他建议,我会喜欢。
    • 你是在for循环里面还是外面添加了postDelayed?如果它在 for 循环中并且仍在发生,那么我建议也请检查其他区域。快速的方法是覆盖 playableTileView 中的 setBackgroundResource 并在背景更改时调用 super,如果相同则忽略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多