1

我有一个生成电话位置的类,它会在每次检索到新位置时更新一个 TextView。我们将这个类命名为 Track。

Track 类包含一个 sendLocation 对象,它是一个 Thread。sendLocation 包含一个 Track 对象,它每 x 一次检查 TextView 是否已更改(Track 类有一个返回 TextView 字符串的方法),如何?

它将最后一个地址保存在一个字符串中,并每 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

4 回答 4

2

两种可能的解决方案

  • 使用UNIQUE数据库中的列(因此它不会包含重复的数据)
  • 调试代码行...equals(...,看看字符串是否真的不同
于 2013-01-02T21:54:17.343 回答
1

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

于 2013-01-02T21:57:56.620 回答
1

你可能有一个种族规则。比较时,保存的变量lastAddress仍未更新为最新值。

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


编辑:

一个很好的链接来了解更多关于你可能发生的事情:线程故事:易失性和同步

于 2013-01-02T22:02:46.383 回答
0

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

你这条线有问题,

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

手表

最后地址

t1.getAddress()

于 2013-01-02T21:59:43.793 回答