2013-01-02 2 views
1

전화 위치를 생성하는 클래스가 있으며 새 위치가 검색 될 때마다 TextView가 업데이트됩니다. 이 클래스의 이름을 트랙으로 지정합니다.문자열 사이의 비교가 잘못되었습니다.

Track 클래스에는 스레드 인 sendLocation 개체가 포함되어 있습니다. sendLocation은 Track 객체를 contatins하고 TextView가 변경되면 매 x 시간마다 검사합니다 (Track 클래스에 TextView 문자열을 반환하는 메서드가 있음).

마지막 주소를 문자열에 저장하고 매 x 시간마다 마지막 주소와 텍스트보기 주소를 비교합니다. 차이가 있다면이 문자열을 내 db로 보냅니다. 중복을 피하기 위해 그렇게했습니다.

내 질문은 어떻게 내 DB에 동일한 주소를 계속 올까? 나는 문자열 비교가 매우 간단하다는 것을 의미합니다.

if(!t1.getAddress().equals(lastAddress)) 
{ 
    lastAddress = t1.getAddress(); 
    //send last address to the db 
    //sleep for a while 
} 

T1이 트랙 인스턴스이다 여기 일부 코드이다.

그리고 여기이 트랙의 getAddress에 방법입니다 :

무엇
public String getAddress() 
{ 
    return this.mAddress.getText().toString(); 
} 

잘못은 간단한 문자열 비교입니다! 귀하의 DB에 열을 UNIQUE를 사용

+1

을 '각 경우에 ... –

+0

두 값 모두 로깅을 시도하십시오. 시작/끝 부분에 공백이 있는지 확인하십시오. 다른 것을 볼 수 없습니다. – jadkik94

+0

당신의 문제가 코드에 있다고 의심됩니다. [SSCCE] (http://sscce.org/)를 만들 수 있습니까? –

답변

1

당신은 홍보입니다 순전히 race codition을 가짐. 비교할 때 lastAddress을 저장하는 변수는 최신 값으로 업데이트되지 않습니다.

다중 스레드 프로그램에서 다른 스레드가 효율성을 위해 동일한 공유 변수의 복사본을 저장합니다. 이 사본은 수시로 업데이트되지만 액세스 할 때마다 모든 스레드가 동일한 값을 볼 수 있다고 보장하지는 않습니다.이를 위해서는 변수를 업데이트/읽기하는 블록에서 synchronized을 사용하거나 volatile으로 설정하여 모든 스레드가 자체 복사본이 아니라 변수의 동일한 값을 가리 키도록해야합니다.


편집 :

당신에게 발생 될 수 있습니다에 대한 자세한 이해하는 좋은 링크 : 당신이 무엇을`getAddress에()`와`lastAddress을보고 일부 로깅을 추가 제안 Threading Stories: Volatile and Synchronized

2

두 가지 가능한 솔루션

  • 코드 라인 ...equals(... 디버깅
  • 하고, 문자열이 정말 차이가 있는지 알아 보려면 (이 중복 데이터가 포함되지 않도록)
+1

나는 동시에 둘 다 제안하고 싶다. :) – jadkik94

1

Andriod 개발에 어느 정도 적용되는지는 잘 모르겠지만이 문제가 발생하면 스레드에 변수의 로컬 복사본이 있다는 것을 의미합니다. 그러면 멤버를 volatil로 정의하기 시작합니다. 이자형. 귀하의 경우에는 추적 개체에 대한 참조가 업데이트된다는 확신이 없지만 해당 참조를 휘발성으로 정의하는 것이 도움이되는지 확인해 볼 수 있습니다.

0

이후 lastAddress = t1.getAddress(); lastAddress가 같은 값이있는 경우, 당신은이 라인에 문제가

,

! t1.getAddress(). 등호 (lastAddress)) 그래서 당신이 줄을 디버깅해야

시계

lastAddress

t1.getAddress()

관련 문제