2010-04-06 82 views
5

我有一個共同的任務,我做了一些活動 - 下載數據,然後顯示它。我已經下載了下載部分;當然,由於在下載完成之前用戶可能會改變方向或取消活動,但代碼已存在,這有點棘手。有足夠的代碼處理這些情況,因此我不想將其複製/粘貼到每個活動中,因此我想創建一個抽象子類活動本身,以便它處理單個後臺下載,然後啓動一個方法用數據填充頁面。在Android中進行子類化活動時,是否有設計模式可以減少代碼重複?

這一切正常。問題是,由於單一繼承,我不得不爲任何其他類型的Activity重新創建完全相同的類 - 例如,我使用Activity,ListActivity和MapActivity。對所有三種使用相同的技術需要三個重複的類,除了每個類都擴展一個不同的Activity。

有沒有可以減少代碼重複的設計模式?就目前而言,我已經節省了大量的重複,但是我很難在三個類中看到完全相同的代碼,這樣每個代碼都可以劃分出不同類型的Activity。

編輯:因爲它似乎我需要更具體一點...

假設我想在方位的變化,解決了的AsyncTask後臺下載的問題。我現在的解決方案是使用回調;有我開始下載的下載管理器,然後我有Activity附加一個回調。當方向改變時,活動被銷燬並重新創建;在此過程中,我分離舊的Activity的回調,然後在新的活動中添加新的回調。

方向更改是一個常見問題,並且在多個活動中,我會在數據加載時以進度視圖開始活動。我試圖解決的是不必重新執行這個方向處理邏輯十次;我最初的解決方案是子類化的活動,但後來我得到了上述問題。

回答

3

Prefer composition over inheritance。無論什麼是常見的,委託給一些可以是Activity,ListActivity和MapActivity成員的類。

+0

我完全理解這個概念,但在這種情況下進行組合就意味着就像在每個類中實現它一樣多的代碼重複。每個類都必須實現onCreate(),onRetainNonConfigurationInstance(),onResume(),onPause(),onDestroy()並調用委託。我寧願不必爲我寫的每個活動考慮這個實現方面。除此之外,我可以說服其他人,但在這種情況下,合成會導致同樣多的重複,除非我錯過了某些東西。 – 2010-04-06 18:13:44

+0

Ick。這表明Android的活動太大,你可能無法控制。我想你可以用已經寫好的函數(和assignDelegate()或其他)編寫DelegatingActivity,並從中繼承。正如你迄今爲止所描述的那樣,它與普通的Activity類相比沒有多大優勢,但它可以在後面付清。 – 2010-04-06 18:19:56

+0

活動的工作方式是他們有不同的方法,在不同的狀態下被調用(例如「onCreate()」和「onDestroy()」)。當你實現你自己的Activity時,你可以細分和擴展這些方法來定義行爲。 你的文章給了我一個想法,它仍然創建各種活動的多個子類,但要讓每個實現一個委託在其中;這樣我就不會每次都執行相同的代碼。儘管如此,我還是希望能夠稍微減少混亂的解決方案。 – 2010-04-06 18:27:55

0

問題是,您正在混合視圖和程序的邏輯。 只要應用程序不會從系統中消失,後臺線程就會像AsyncTask一樣運行。您可以在異步任務中下載所有內容,然後將其保存在SD卡的某個位置,以便在該位置準備就緒時從該位置取回。

您可以繼承application class以保存對任務或處理程序的引用,以便與每個活動的類進行通信。

如果這不是你的問題的解決方案,也許你可以澄清一點問題。這將有助於知道你在做什麼onCreate ...方法。

+0

我認爲你已經對我已經設置的內容有了一個狹隘的看法。 :)我已經編寫了一個通過AsyncTask在後臺下載的庫,但是這樣的庫不能解決通過定位更改導致的活動破壞/娛樂等問題。當方向改變時,我必須能夠將活動重新附加到正在進行的下載中(在我的情況下,通過設置新的回調)。我正在談論的減少重複的代碼是這個代碼;每個活動必須處理方向更改,並且因爲它們是我想要重用的每個活動之間的相同代碼。 – 2010-04-06 19:18:19

+0

我還沒有得到你所做的所有onresume ondestroy等活動,也許你應該給一些代碼示例 – Janusz 2010-04-06 19:32:43

0

我還沒有使用MapActivity,但我解決了這個問題,不使用ListActivity並在Activity中自己提供了這些功能。在ListActivity中確實沒有那麼多,如果你看起來:http://google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/app/ListActivity.java自己實現這個功能,你可以獲得更多的定製和更多的增長空間。

+0

我想過你的解決方案,但根據文檔MapActivity不能以這種方式忽略:「一個MapView只能由MapActivity構造(或誇大),這是因爲它依賴於在後臺訪問網絡和文件系統的線程;這些線程必須由MapActivity中的生命週期管理來管理。 (http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html) – 2010-04-06 20:29:49

+0

corect,我面臨同樣的問題,而不是我使用的ListAcivity我的OwnActivity與一些實現,但與MapActivity我所能做的就是複製粘貼。 我最終使用的解決方案,不是因爲它非常乾淨,而是因爲它集中代碼在一個地方是爲我的基本活動需求(在你的情況下onDownloadFinish,onDetachListener,onAttachListener等...)使用一個接口,並有一個委託類實現這些方法,然後每個需要該行爲的活動也將實現該接口並將所有調用委託給該對象... – codeScriber 2011-07-10 11:21:33

0

任何方式讓你有一個助手類與靜態方法,你會傳遞你的活動,並有共同的工作在那裏而不是在每個活動中完成?

+0

目前我有類似這樣的設置,雖然我所做的事情的性質必須是實例化對象不是靜態方法。但是,此解決方案仍然意味着您必須在每個要使用此功能的活動中重寫相同的代碼,或者必須對每種類型的活動進行子類化以減少代碼重複。 – 2010-04-06 21:29:37

相關問題