2010-08-16 58 views
0

我有一個網絡客戶端類,它接收一個大的二進制塊並將其解析爲一個可用的Java對象。網絡客戶端與應用程序的View不在同一個線程中。什麼是使該對象可用於視圖的最佳方式?我想出了以下解決方案,但我覺得他們都不是正確的:如何在Android中的活動中共享大對象?

  1. 創建網絡客戶端的對象,並讓視圖直接訪問它
    • 我就送Handler中的一條小消息告訴View數據已更新
    • Con:要求我在線程之間同步對象以確保Network View在View訪問時不會替換對象
  2. 序列化(?包裹)在網絡客戶端的對象,並通過處理器將其發送至搜索
    • 臨:沒有數據
    • 精讀的所有權的問題:很可能是一個巨大的性能負擔應用
  3. 創建對象的引用,並傳遞到視圖
    • 我來自一個C++的背景,我不知道這甚至有可能在Java中。我是C++,我可以只發送一個指向該對象的指針並讓它處理它。這似乎是Java不會讓我做的事情。這是可行的嗎?

是否有任何這些解決方案的建議,或者我應該在一個完全不同的方式解決這個問題?

回答

0

如果當活動在後臺時不想繼續下載,則使用非阻塞IO,而不是線程。

如果您確實想在活動處於後臺時繼續下載,則可能需要使用服務。你可以使對象Parcelable左右;我認爲如果你的活動和服務在同一個進程中(我認爲它們是默認的,但ICBW),底層的服務實現會傳遞指針。

+0

這是一個很好的問題,我沒有多少考慮。我想我的網絡客戶端需要成爲一個服務;如果我不在後臺下載,當應用程序恢復時,我正在監聽的套接字將完全充滿舊數據。由於我打算將網絡客戶端轉變爲服務,因此需要將希望與該活動共享的任何數據進行加密,請更正?沒有其他方法嗎? – Topher 2010-08-16 03:22:34

+0

如果您使用的是本地服務,則可以創建getter和setter,並像任何其他對象一樣與服務進行通信。搜索本地服務以獲取更多信息。 – Janusz 2010-08-16 09:26:33

+0

正如我所說,這取決於。如果他們在同一個進程中運行,底層實現將(我認爲)嘗試傳遞指針而不是複製數據。 – 2010-08-16 21:25:57

0

如果對象真的很大,並且不習慣用get方法返回它,也許可以將其內容放入SQLite數據庫中,並可以將其作爲ContentProvider公開。你也可以發送一個意圖,然後導致視圖然後去抓取有效載荷或附加到意圖。

+0

很好的答案,但我想避免使用SQLite等外部存儲。 – Topher 2010-08-23 00:59:35

+0

你不必在SQLite中使用外部存儲,你可以使用你的/data/data/com.domain.appname/目錄。有關更多信息,請參閱此鏈接:http://developer.android.com/guide/topics/data/data-storage.html#filesInternal – Frank 2010-08-24 01:33:17

0

看看application這個類繼承這個類,並在你的清單中引用這個類將使你能夠將服務/下載控制器的引用存儲在應用程序的每個活動中都可用的中心位置。這使您可以將數據保存在內存中,並且如果您在更多的地方只需要一個活動,就可以減少重新創建大對象的需要。

對於下載,您可以使用本地service通過活頁夾對象與您的活動進行通信。請記住,服務不是一個線程。如果你想在後臺運行下載,你需要在服務的oncreate方法中創建一個線程。

另外請記住,最好有一個註釋顯示用戶服務正在做某件事情,並讓他訪問服務並取消它或查看它的狀態。