应用程序对象不会共享

时间:2012-05-03 22:32:51

标签: object singleton global android

我的应用程序对象出现问题。我目前正在使用服务来模拟来自电子游戏板的传入数据。该数据表示为2D布尔数组。 Service每五秒钟使用一个Application Object方法来更新数组(setDetectionMap())。我的主Activity中的一个Thread正在使用另一个方法(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标签以确保代码在我认为它应该执行时执行,我甚至实现了所谓的冗余单例代码。可能导致这种情况的任何想法?顺便说一句,任何人都可以告诉我如何在活动运行时查看变量状态?提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

轻松修复:在setDetectionMap中,手动将newMap中的值复制到detectionMap中。或者,更新活动的参考,以便查看正确的地图。

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