比较字符串出错了

时间:2013-01-02 21:49:30

标签: java android

我有一个生成手机位置的类,每次检索到新位置时它都会更新TextView。 我们将此课命名为Track。

Track类包含一个sendLocation对象,它是一个Thread。 sendLocation包含一个Track对象,如果TextView发生了变化(Track类得到一个返回TextView字符串的方法),它每隔x次检查一次,怎么做?

它将字符串中的最后一个地址保存起来,并在每x时间比较最后一个地址和文本视图地址,如果它们不同,它会将此字符串发送到我的数据库。 我这样做是为了避免重复。

我的问题是,为什么它一直向我的数据库发送相同的地址?我的意思是比较字符串非常简单。 这是一些代码:

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

t1是一个Track实例。

这是Track中的getAddress方法:

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

什么是错的?这是一个简单的字符串比较!!

4 个答案:

答案 0 :(得分:2)

两种可能的解决方案

  • 在数据库中的列上使用UNIQUE(因此它不包含重复数据)
  • 调试代码行...equals(...,并查明字符串是否真的不同

答案 1 :(得分:1)

我不确定这对Andriod开发有多少适用,但在常规Java世界中,当你遇到这样的问题时,这意味着你的线程有一个变量的本地副本,当你开始将成员定义为volatile时。在您的情况下,我不相信跟踪对象的引用会更新,但您可以尝试查看将该引用定义为volatile是否会有所帮助。

答案 2 :(得分:1)

你可能有race codition。在您进行比较时,保存lastAddress的变量仍未使用最新值进行更新。

在多线程程序中,不同的线程会保存同一共享变量的副本以提高效率。此副本将不时更新,但不保证所有线程在每次访问时都会看到相同的值。为此,您必须在更新/读取变量的块中使用synchronized,或将其设置为volatile,使所有线程指向相同的变量值,而不是拥有副本它自己的。


修改

一个很好的链接,可以更多地了解可能发生在您身上的事情:Threading Stories: Volatile and Synchronized

答案 3 :(得分:0)

lastAddress = t1.getAddress(); 如果lastAddress是相同的值,

你有这条线的问题,

!t1.getAddress()。equals(lastAddress))所以你应该调试这一行

观看

lastAddress

t1.getAddress()