2012-12-21 59 views
2

我正在開發具有多個線程的Android應用程序 - 其中之一是每秒從GPS接收器獲取數據1次。我希望其他線程能夠訪問GPS線程中的信息。Android多線程應用程序 - 共享狀態

我已經試着用消息隊列來做它,但它使代碼變得非常混亂 - 我創建的所有新線程都必須以自己的方式處理消息,所以我必須在每個線程類中執行大量新的實現。

我想能夠簡單地得到這樣的數據:

ApplicationState.getLocation(); 

這樣我就可以使用最新的數據。我怎樣才能做到這一點?我不想用synchronized字段創建靜態類,因爲我不想鎖定線程太久,因爲我正在其他線程中進行一些在線圖像分析。

這裏最好的方法是什麼?

乾杯, Nebril

+0

你可能想看看你的座標變量的volatile關鍵字,因爲你似乎只需要'(x,y,z)'這個3'double':[小小的howto](http:// www .javamex.com/tutorials/synchronization_volatile.shtml) – nkr

+0

我想通過一些共享不同變量的通用方式。此外,引用http://en.wikipedia.org/wiki/Volatile_variable#In_Java「(但是,不能保證volatile讀寫的相對順序與常規讀寫相關,這意味着它通常不是有用的線程構造。)「 – Nebril

回答

3

您是否考慮過使用事件總線系統? Otto, an Apache licensed library from Square非常整齊。

您可以創建一個位置更新類,以觸發新的LocationUpdateEvents。任何對收到此更新感興趣的對象都可以使用註釋爲@Subscribe的方法。對於不依賴雜亂監聽器接口的進程間通信來說,這是一種可愛的方法。

Otto的另一個優點是您的LocationUpdater類可以使用@Produce註釋方法。有了這個,begins收聽LocationUpdateEvents的任何對象都會立即收到一個,其中LocationUpdater找到的最後一個位置。

+0

感謝您在閱讀您的答案之前,我和我的同事們決定實施Observer模式,這與Event Bus非常相似,如果我們厭倦了編碼,我們會給Otto一個試試:) – Nebril

+1

Otto不適用於進程間通信!!!請參閱https://github.com/square/otto/blob/master/library/src/main/java/com/squareup/otto/Bus.java但在您的情況下(您使用多線程而不是milti-process應用程序)otto將是dev的不錯選擇。 – gezdy

1

1)創建應用程序類 「MyApp的」:在清單文件

1.1):

<application 
    android:name=".MyApp" 
    .... 
/> 

1.2),創建該類:

public class MyApp extends Application { 
    public void onCreate() { 
      super.onCreate(); 
    } 

    private volatile Location mLastLocation = null; 
    public Location getLastLocation(){ 
     return mLastLocation; 
    } 
    public void setLastLocation(Location mLastLocation){ 
     this.mLastLocation = mLastLocation; 
    } 
} 

2)從應用程序中的任何上下文中設置位置(服務,任何活動)在同一過程中(小心有一個過程。你可以有1個過程和Android的多線程):

((MyApp)context.getApplicationContext()).setLastLocation(location); 

3)得到來自任何方面的最新位置在您的應用程序在同一個進程:

((MyApp)context.getApplicationContext()).getLastLocation(); 

注意:您還可以使用聽衆更好的表現。在MyApp監聽器的列表中註冊並從onLocationChanged觸發監聽器

+0

是否可以將上下文傳遞給應用程序中的每個線程?我的意思是,上下文對象線程安全嗎? – Nebril

+1

是應用程序上下文是線程安全的 – gezdy

+1

應用程序上下文已被所有其他人(服務和活動)共享。只有一個進程 – gezdy