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

Firebase onChildAdded回调中调用invalidate()未触发onDraw函数问题

Firebase onChildAdded中调用invalidate()未触发onDraw的解决办法

以下是几个排查和解决方向:

  • 回调线程不匹配
    Firebase的ChildEventListener回调默认在后台线程执行,而invalidate()必须在UI线程调用才会触发视图重绘。你需要把invalidate()切换到UI线程执行:
childEventListener = databaseRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
        String strikeAsString = (String) snapshot.getValue();
        // 切换到UI线程调用invalidate
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                invalidate();
            }
        });
    }
});

如果是在自定义View内部,也可以用post()方法简化:

post(new Runnable() {
    @Override
    public void run() {
        invalidate();
    }
});
  • 检查View状态与尺寸
    如果当前View处于GONE/INVISIBLE状态,或者宽高设置为0,即使调用invalidate()也不会触发onDraw。确认View的可见性为VISIBLE,且布局中给了有效的宽高值。

  • 验证回调是否真的触发
    在onChildAdded里添加日志输出,确认该方法确实被执行了——有可能是数据库路径错误、权限配置问题导致数据没有更新,回调根本没触发。

  • 检查onDraw重写逻辑
    确保你的onDraw方法正确重写,且调用了super.onDraw(canvas)(如果需要保留父类的绘制逻辑)。另外排查是否有其他代码拦截了视图的重绘请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:52:07