0

我的应用程序对象有问题。我目前正在使用服务来模拟来自电子游戏板的传入数据。此数据表示为 2D 布尔数组。每五秒服务使用应用程序对象的一个​​方法来更新数组(setDetectionMap())。我的主 Activity 中的线程正在使用另一种方法 (getDetectionMap()) 读取此数组。经过一些调试后,我几乎可以肯定主 Activity 没有看到变化。这是我的应用程序对象的代码:

 public class ChessApplication extends Application{

    private static ChessApplication singleton;
    private boolean[][] detectionMap;

    public static ChessApplication getInstance(){
        return singleton;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        singleton=this;
        detectionMap=new boolean[8][8];
    }

    public boolean[][] getDetectionMap(){
        return detectionMap;
    }
    public void setDetectionMap(boolean[][] newMap){
        detectionMap=newMap;
        Log.d("Chess Application","Board Changed");
    }
}

我检查了我的清单,我重写了我的对象声明十几次,我添加了 LogCat 标记以确保代码在我认为应该执行的时候执行,我什至实现了所谓的冗余单例代码. 有什么想法可能导致这种情况吗?顺便说一句,谁能告诉我如何在活动运行时查看变量状态?提前致谢。

4

1 回答 1

0

更新发生后,您的 Activity 是否调用 getDetectionMap() 来获取新地图?

因为否则,它会保留对旧 boolean[][] 数组的引用,而 setDetectionMap(...) 实际上并没有更新当前数据结构,它只是更新“detectionMap”变量以指向不同的数据结构。因此,您的主要活动在下一次调用 getDetectionMap 之前不会知道交换。

简单修复:在 setDetectionMap 中,手动将值从 newMap 复制到 detectionMap。或者,更新 Activity 的引用,使其查看正确的地图。

另一个与原始问题完全无关的观察结果:在 Android 开发过程中覆盖 Application 是非常不寻常的,并且通常被认为是“代码异味”,除非您有充分的理由这样做在这种情况下,我想这是为了让您可以在服务和 Activity 之间进行通信,但是您创建了一个中间人,而中间人并不是完全必要的。 这是一个关于如何在两者之间直接通信的有用 SO 线程:)

于 2012-05-03T23:49:16.537 回答