2010-11-23 64 views
2

我對我的應用程序有以下框架: 1.在後臺(隊列)中運行以發出請求並獲取異步響應的網絡線程。該線程在應用程序對象中啓動和停止,因此它將通過整個應用程序。 2.一個DataManager,它也是應用程序的成員,並且具有不同的DataManagers,用於從網絡中檢索的數據類型。數據管理器本身就是來自網絡響應的監聽者,所以在應用程序本身死亡之前它是安全的。 3.這是有問題的部分。我的一些適配器和我的活動的一部分是DataManagers的DataListeners,這意味着數據管理器會保留對它們的引用。作爲監聽器和內存泄漏的活動

當發生電話或其他電話事件時,我注意到該活動通常處於暫停狀態並且未被銷燬,因此會收到我的活動,這沒關係。當橫向\縱向改變時,問題就開始了。因爲我保持對應用程序綁定對象中的活動的引用,一方面活動不能被銷燬,但事件仍然到達偵聽器,只有錯誤的... 基本上我可以通過以下方式解決該問題:刪除onDestroy中的監聽器並保留配置布爾值來告訴我,請求已存在問題,我只需要放置一個監聽器並嘗試從數據管理器中檢索數據。

但是:-)我想知道android如何處理這種情況通常,如果這是一個服務運行。或者如果服務是使用綁定的本地服務,並將活動作爲監聽器傳遞給網絡事件,則會發生相同的事情,直到偵聽器不會被移除,活動就會泄露並繼續存在,但如果沒有它,則無法從網絡獲得回調... 一個意圖要求嚴重的數據(例如,位圖的系列化和無效化)

而anywa,假設我發送一個意向每個respose我得到,我怎麼得到意圖到活動(我知道的getIntent,但如果我得到另一個,不相關,我把它作爲'事件'嗎?)

回答

0

好吧,讓我來描述問題和我在更多細節中找到的解決方案。 問題: 我有一個Service \ Network線程需要通過它發送請求的活動,要求或錯誤已以異步方式到達。使用監聽器模式,需要我之前設置監聽器或當我發送一個請求,像這樣:

mNetService.setRequest(request, this); 

哪裏,是實現我的監聽器接口活動。 但這樣做需要我從onDestroy中的服務中移除偵聽器並返回偵聽器,如果我曾經在onCreate \ onResume中發回請求,但響應也可以在活動未偵聽時正好到達(橫向\肖像事件),這需要我在服務中保留Error \ Response,直到some1撿起並重置它。

我找到的解決方案: 使用廣播和BroadcastReciever。 這只是解決方案的一部分,但它讓您擁有一個偵聽器來廣播(可以針對特定的類類型,意思是Activity)和動作。 由於我的所有活動都繼承了一個基本的Activity類,因此它們都具有一個BroadcaseReciever內部類,用於偵聽篩選器中的某些操作。 是我在我的Activity的C'tor中啓用監聽器將在onResume中註冊並在onPause中註銷。 如果偵聽器獲取onRecieved事件,它將調用Activity中的一個方法(我可以在我的特定活動中重寫),並將它傳遞給我可以包含響應中所有數據的Intent。

唯一缺失的部分是如果活動死了一秒,只有廣播到達會發生什麼?啊,這是一個問題,所以android intorduces呆在那裏的直播直播,直到你用removeStickyBroadcast(意圖)刪除它們,所以當我從我的服務廣播我發送粘滯廣播,當活動獲得我的廣播它刪除它,所以它不會停留圍繞並誤導有關到達的新響應的活動。 唯一的問題是如果我發送一個請求,不要等待響應並立即進入下一個活動,在這種情況下,當我回到那個活動時,它會認爲它得到了迴應。目前還沒有找到合適的解決方案。但是,比我以前的解決方案更好。

1

從我收集它的習慣在Android上刪除自己的監聽列表時活動被破壞。這有點容易出錯,但我認爲這是普遍接受的方式。

你可以想象你的服務只接受一個偵聽器,這個偵聽器可能適合或不適合你的情況,當活動重新開始向DataManager註冊時,它會覆蓋舊的活動,而這又會被垃圾收集。缺點是,如果活動內存被破壞但服務仍在運行,則不會釋放活動內存,因此,最好從偵聽器中刪除活動。

+0

我的想法正確..我認爲這將是我的方法,我有點認爲intents可以緩解任務。但我不知道它是否緩解或複製它。 – codeScriber 2010-11-27 16:10:18

1

Android開發與其他平臺(例如BlackBerry)有很大不同。我不能給你一個快速一勞永逸的解決方案,但是這裏有關於這個我的想法:

我的一些我 活動的適配器和一部分是我 DataManagers DataListeners,這意味着數據 經理保持對他們的參考。

操作系統根據其lifecycle殺死活動。所以你應該避免在Activity被操作系統銷燬之後在另一個對象中保留一個Activity的句柄。否則你會得到內存泄漏。

也請記住Application子類實例並不總是爲整個應用程序會話(從用戶角度來看是一個會話)而存在。例如,如果您的應用程序在後臺進行,則由於接聽電話,您的整個過程可能會被終止。看詳情here。只要Application子類包含一些狀態,如果進程被終止,則該狀態不會被保留,您可能會錯誤地期望您的句柄指向一些非空實體。但是,在進入前臺(和進程恢復)之後,這些可能只是空值,因爲操作系統已創建Application子類的新實例。

+0

你對這裏的幾個問題很感興趣,但說明白我知道,我知道我的設計並非百分之百或100%符合Android設計準則,但這就是設計。我可以提供一些小的東西,如註銷或可能使用意圖,而不是註冊regualr聽衆。但我需要遵循我上面寫的指導原則。 關於殺死應用程序,你當然是,但這是一個小的機會,當應用程序恢復,直到它完成它的onCreate沒有其他活性將被恢復,所以我能做的是檢查我的請求是否在隊列中或重新發送 – codeScriber 2010-11-27 16:13:13