2011-08-18 82 views
1

我嚴格分隔了Android應用程序的不同部分之間的層次。 在執行的某個時候,我正在從Internet上的xml服務更新我的數據。該更新大約需要10秒鐘,並且完全在後臺完成 - 這意味着應用程序的用戶界面可以正常工作。然而,進一步調用我的類(後來 - DataManager),它負責數據更新(更新已經開始但尚未完成)使我的應用程序崩潰。拋出NullPointerException異常的對象。Android併發問題

所以我假設一次只有一個線程可以使用我的DataManager,而從其他線程調用DataManager最終會出現異常。

我嘗試了將'synchronized'關鍵字放在敏感方法附近的各種組合,但似乎更新正在執行 - 沒有任何東西可以使用我的DataManager中的任何東西。

在執行過程中與DataManager相關的其他類似乎也包含空對象。

我想我只是缺少某種設計模式,用於處理併發問題,也許任何人都可以建議我一些東西?

+1

你能否提供一些你認爲是NullPointerException的根本原因的代碼。很難想到任何併發問題。 –

+0

看看它是否只是一個NullPointerException,然後我可以自己處理它,我對調試Android應用程序非常有經驗。但是這個問題似乎影響整個應用程序。可悲的是我無法提供代碼,因爲它有太多的影響,代碼庫相當大......這不像我忘記初始化一些愚蠢的變量......當我沒有更新時,一切正常。更新實際上只涉及我的經理類中的四個ArrayLists。其實等一下,我可以發佈我的更新方法並解釋一下。 – Kostas

+0

所以這是實現所有更新的實際方法:http://pastebin.com/gY3x8wiq 它直接(和間接)只能訪問四個ArrayLists。即使在執行過程中,其他對象也會受到影響。 – Kostas

回答

2

由於線程問題,我無法處理使用Apache HTTP客戶端,我認爲你的問題在這方面可能類似。我最終做的是建立一個回調方案。當然,這可能或可能不適合你。

這可能看起來有點像Rube Goldberg,但是它對我很有用。

我會讓我的UI線程調用我的數據管理器對象的方法,產生一個線程去獲取數據。該方法的返回值是EVENTUALLY中包含數據的對象。我會讓我的活動擴展一個接口,就像「DataCallbackInterface」一樣,該方法在線程獲取數據(即run()中的最後一行)後調用。由於該調用本質上將在另一個線程內,所以您需要使用Handler在您的DataCallbackInterface方法的實現中運行任何有用的東西。當調用該方法時,您將知道數據存在,而不依賴於任何奇怪的同步標記來正確使用。

+0

這實際上是一個絕妙的主意。使用事件將我的DataManager鎖定在正在執行更新的同一線程中,並禁止其他程序部分正確使用DataManager!對? :D 所以我應該做這樣的後臺任務,它執行所有的操作,並且只返回數據的最後一行代碼。因此,在執行過程中,我的程序將使用DataManager中的舊數據,並且在更新執行完成後,數據將被替換。不用擔心線程!對?我的意思是,我有正確的想法嗎? – Kostas

+0

我想我是。雖然它需要重新設計一些我的應用程序部件,但這絕對會起作用!謝謝 :) – Kostas