2012-05-29 111 views
0

我想知道是否有改變地理座標的座標。在文檔中找不到任何函數來顯示除了在構造函數中設置座標的任何方法。這對我來說很麻煩,因爲我需要不斷更新Geopoint的座標(跟隨Google地圖上的對象)。Android更改地理座標

如果Geopoint的座標不能更新或更改,我應該使用別的東西嗎?我應該不斷實例化一個新的Geopoint?

此外,作爲一個側面的問題。我會在哪裏放置需要不斷循環的代碼(專門搜索數據包)在MapActivity中?

謝謝!

+0

,你應該接受它。 –

回答

0

你真的需要一個可變的GeoPoint?你確定創建GeoPoint的連續實例會成爲一個性能問題嗎?你能否像Nate所說的那樣只保留原始變量的經緯度,並且只根據需要轉換爲GeoPoint,或者你需要每一個都成爲GeoPoint?

如果你確定你需要一個可變的GeoPoint,你可以創建一個。 GeoPoint類不是final,所以你可以擴展它。但要小心:將可變對象放入HashMap,HashSet或任何其他基於散列的集合中都會產生令人驚訝的(並且錯誤纏身)結果。

小心你不要無意中將一個API傳遞給一個將它放入這樣一個集合中的API,即使你自己沒有明確這樣做。

import com.google.android.maps.GeoPoint; 

public class MutableGeoPoint extends GeoPoint { 
    private int latitudeE6, longitudeE6; 

    public MutableGeoPoint(int latitudeE6, int longitudeE6) { 
     super(0, 0); // the values in the superclass are moot 
     this.latitudeE6 = latitudeE6; 
     this.longitudeE6 = longitudeE6; 
    } 

    @Override 
    public int getLatitudeE6() { 
     return latitudeE6; 
    } 

    @Override 
    public int getLongitudeE6() { 
     return longitudeE6; 
    } 

    public void setLatitudeE6(int value) { 
     this.latitudeE6 = value; 
    } 

    public void setLongitudeE6(int value) { 
     this.longitudeE6 = value; 
    } 

    @Override 
    public int hashCode() { 
     return 29*latitudeE6 + longitudeE6; 
    } 

    @Override 
    public String toString() { 
     return latitudeE6 + "," + longitudeE6; 
    } 
} 

編輯將hashCode()方法更改爲與Google的GeoPoint類相同。

如果其中一個答案解決您的問題(GeoPoint對象和MutableGeoPoint不會比較平等的平等。擔心這樣的事情快速達到收益遞減點。)

0

documentation for the GeoPoint class

公共類的GeoPoint擴展java.lang.Object

表示一對緯度和經度的不可變的類,存儲爲整數 數字微度的。

術語不可改變表示它不能改變。所以,你不會找到任何方法來改變這些值。它看起來並不像一個特別重量級的對象,如果你擔心一遍又一遍重新創建GeoPoint的開銷。如果你喜歡,你可以簡單地保存整數緯度(E6)和經度(E6)值,而不是GeoPoint。當然,int變量是可變的(可以改變)。

在任何一種Activity中,您都可以創建一個工作人員,使用您自己的子類AsyncTask連續循環並執行任何您想要的操作。見this article for a description of using AsyncTask

+0

'int's不可變。你不能把數字4改成5。您可以將連續的值賦給一個'int' _variable_,就像您可以將連續的值賦給一個String變量或一個GeoPoint變量但不會使String或GeoPoint變爲可變的一樣。 –

+0

@David,是不是隻是語義,但?爲int原語分配一個新值不會導致構造函數運行,或者發生新的堆分配,這是人們通常試圖避免的事情,當他們抱怨必須重新創建新對象時,而不是重新使用現有的對象, 對? – Nate

+0

這是真實的性能。但關於不可變類型的事情是,如果將它們傳遞給某個人,他們不能被改變。這樣,int比StringBuilder更像String。您可以多次分配相同的字符串變量,但每個字符串值都是不可變的。所以int具有不可變的語義。 –