You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android MediaPlayer onCompletion触发后canvas未自动重绘问题求解

问题根因

Android 自定义View默认只有主动调用invalidate()方法时才会触发onDraw()重绘界面。你现有的代码里只有玩家操作触发movePlayer()时才会调用invalidate()刷新,而createMaze()生成新迷宫后没有主动触发重绘,因此新迷宫要等玩家再次移动才会显示。

解决方案

在createMaze()方法的末尾新增重绘触发逻辑即可,修改后的createMaze()代码如下:

private void createMaze() {
    Stack<Cell> stack = new Stack<>();
    Cell current, next;

    cells = new Cell[COLS][ROWS];

    for (int x = 0; x < COLS; x++) {
        for (int y = 0; y < ROWS; y++) {
            cells[x][y] = new Cell(x, y);
        }
    }

    player = cells[0][0];
    exit = cells[COLS - 1][ROWS - 1];

    current = cells[0][0];
    current.visited = true;

    do {
        next = getNeighbour(current);
        if (next != null) {
            removeWall(current, next);
            stack.push(current);
            current = next;
            current.visited = true;
        } else {
            current = stack.pop();
        }
    } while (!stack.empty());

    nextAction = "NOTHING";
    playSound("START");
    // 新增:主动触发View重绘,新迷宫会立即渲染到屏幕
    invalidate();
}

补充说明

如果担心MediaPlayer的onCompletion()回调不在主线程导致invalidate()失效,可以把invalidate()替换为postInvalidate(),后者支持在任意线程调用,能安全触发重绘。

内容的提问来源于stack exchange,提问作者Clodoaldo Favaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:33:03