2012-05-03 2 views
0

내 응용 프로그램 개체에 문제가 있습니다. 현재 전자 게임 보드에서 들어오는 데이터를 시뮬레이션하기 위해 서비스를 사용하고 있습니다. 이 데이터는 2D 불린 배열로 표현됩니다. 5 초마다 Service는 응용 프로그램 개체의 메서드를 사용하여 배열을 업데이트합니다 (setDetectionMap()). 이 배열은 다른 메소드 (getDetectionMap())를 사용하여 주 활동에서 스레드에 의해 읽혀지고 있습니다. 디버깅을 한 후에는 주 활동이 변경 사항을 보지 못한다는 것이 거의 긍정적입니다.응용 프로그램 개체가 공유되지 않습니다.

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"); 
    } 
} 

내 매니페스트 확인했지만, 내가 수십 번 내 객체 선언을 다시 한 나는 때 코드가 실행되고 있는지 확인 로그 캣 태그를 추가했습니다 : 여기 내 응용 프로그램 개체에 대한 코드입니다 그것이 있어야한다고 생각하고, 심지어 중복되는 Singleton 코드를 구현했습니다. 어떤 아이디어가 이것을 일으킬 수 있습니까? 덧붙여 말하자면 누구나 액티비티가 실행 중일 때 변수 상태를 보는 방법을 말해 줄 수 있습니까? 미리 감사드립니다.

답변

0

업데이트가 발생하면 getDetectionMap()을 호출하여 새 맵을 가져올 수 있습니까?

그렇지 않으면 이전 부울 [] [] 배열에 대한 참조를 보유하고 있기 때문에 setDataMap (...)은 현재 데이터 구조를 실제로 업데이트하지 않고 단지 "detectMap"변수를 가리키고 있습니다 다른 것. 따라서 주 활동은 다음에 getDetectionMap을 호출 할 때까지 스왑 아웃을 인식하지 못합니다.

쉬운 수정 : setDetectionMap에서 newMap의 값을 수동으로 detectMap에 복사하십시오. 또는 액티비티 참조를 업데이트하여 올바른지도를 볼 수 있습니다.

원래의 질문과는 완전히 다른 한 가지 다른 관찰 : Android 개발 중 응용 프로그램을 덮어 쓰는 것은 매우 드문 일이며, 이 실제로이 아닌 한 일반적으로 "코드 냄새"로 간주됩니다. 이 경우 나는 당신이 당신의 서비스와 활동 사이에서 의사 소통을 할 수 있도록하는 것이지만 상상할 수없는 중산층을 만들 것이라고 상상합니다. Here's a useful SO thread 두 사람 사이에 직접 통신하는 방법 :

+0

답장을 보내 주셔서 감사합니다. 그래서 저는 실제로 .getDetectionMap()이 특정 값 (내 서비스에서 하드 코딩하는 것)을 반환 할 때까지 대기하는 while 루프를 사용하여 내 Activity에서 업데이트를 폴링합니다. 그러나 쓰기가 완료되었음을 결코 인정하지 않습니다. . 그러나 내가 while 루프를 입력하기 전에 내 주 활동에서 .setDetectionMap()을 사용하여 값을 설정하면 정상적으로 작동합니다. 그렇기 때문에 내 Application Object가 Singleton 역할을하지 않고 내 Activity와 Service가 둘 다 Object의 다른 인스턴스를 실행하고있는 것처럼 보입니다. 감사. – user1373705

+0

두 개의 다른 응용 프로그램 개체를 실행하는 경우 나는 놀랄 것입니다. 그러나 예방책과 마찬가지로 detectMap을 정적으로 설정할 수 있습니다. 그런 다음 문제가 사라지면 두 개의 다른 Application 인스턴스라는 것을 알게됩니다. –

+0

static으로 detectMap을 설정해 보았지만 문제가 지속됩니다. LogCat 태그를 사용하여 Service and Activity가 예상 시간에 읽기/쓰기를하고 있으며 Application Object가 이러한 호출에 응답하고 있음을 확인했지만 아직 두 개는 서로를 전혀 인식하지 못하는 것 같습니다. – user1373705

관련 문제