1

電話の場所を生成するクラスがあり、新しい場所が取得されるたびにTextViewが更新されます。このクラスにTrackという名前を付けます。

Trackクラスには、ThreadであるsendLocationオブジェクトが含まれています。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

4 に答える 4

2

2つの可能な解決策

  • UNIQUEDBの列で使用する(重複データが含まれないようにするため)
  • コード行をデバッグし...equals(...、文字列が実際に異なっていないかどうかを確認します
于 2013-01-02T21:54:17.343 に答える
1

これがAndriod開発にどの程度当てはまるかはわかりませんが、通常のJavaの世界では、このような問題が発生した場合、スレッドに変数のローカルコピーがあることを意味し、メンバーを揮発性として定義し始めます。あなたの場合、追跡オブジェクトへの参照が更新されるとは確信していませんが、その参照を揮発性として定義することが役立つかどうかを試してみることができます。

于 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)) なので、この行をデバッグする必要があります

見る

lastAddress

t1.getAddress()

于 2013-01-02T21:59:43.793 に答える