2012-05-24 113 views
0

我正在嘗試解決以下問題: 我正在編寫一個具有共享數據模型的多個活動的應用程序。 的數據是從數據庫中取出時,應用程序啓動並保存爲應用類擴展全局變量如下:從android中的處理程序獲取應用程序實例

class MyApp extends Application { 

    private MyData myData; 

    public MyData getData(){ 
    return myData; 
    } 
    public void setData(MyData d){ 
    myData = d; 
    sendBroadcast(new Intent("DATA_UPDATED");); 
    } 
} 

的AndroidManifest.xml中進行更新,當然,一切的偉大工程 - 每一次活動都可以讀取數據和更新它,其他活動可以使用BroadcasrReceiver獲取數據更改的通知。 當我有另一個應該更新主(GUI)線程的線程時,情況會變得有問題: 當從數據庫接收到新數據時,我有一個包含回調的服務。回調函數在新線程上運行,因此必須在主線程上更新我的Apllication數據模型。 的,我用的處理程序如下:

public void ServiceCallback(...newData) {   
    //Pass the message up to our handler to make the update on the main thread. 
    Message receipt = Message.obtain(mHandler, 0, newData); 
    receipt.sendToTarget();  
} 

    //Handle incoming message from remote on the main thread (GUI thread) 
    private Handler mHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
    //read new data from the message - from msg.obj field, no prob.    
    //but - how can i get to my application model instance???? 
    } 
}; 

所以,我雖然通過它正是我傳遞的消息在NEW_DATA,但我看到in this post

,它可能會導致內存泄漏...?我不明白它是否真實,爲什麼,也許我有另一種解決方案,任何人都可以建議?我真的很感激。線程之間可以使用廣播接收器嗎?也許這是我的解決方案?

回答

1

這是有點不清楚你到底想要做什麼。需要注意的一點是:爲共享/全局數據使用應用程序對象並不會真正爲您購買任何東西。你可以簡單地使用一個單身人士。如果你想使用Application,你可以給它添加一個靜態的getInstance()方法,因爲它只有一個實例,它通過定義是一個單例,添加該方法將簡化從非活動類訪問的過程。您不必更新主線程中的Application類中的數據。當您處理UI時,您只需在主線程上進行操作。

此外,如果你只是想發送消息到另一個線程,Handler就足夠了。無需涉及BroadcastReceivers

+0

感謝您的回覆。實際上,我的第一個實現是簡單的單例,但是當我的應用程序在後臺運行一段時間後,出現了一個錯誤,單例被刪除,所以我得到了空引用。這就是我轉向Application類的原因。 –

+0

如果你的進程被終止,單身數據將自然丟失。但是Application類也是如此。除了有一個'onCreate()'方法,你可以初始化東西,它絕不是特別的。你可以用一個帶有懶惰初始化數據的單例實現同樣的事情。 –

+0

我的進程沒有被終止 - 服務仍在運行,但無法從單例中讀取數據。單身人士的記憶被清除了某些我不能理解的原因,我雖然也許如果我使用應用程序類它會工作。這個問題正在殺死我:( –

相關問題