2012-10-25 65 views
2

我的應用程序有幾個Fragments。每個Fragment都會啓動一個Service,該請求會爲來自服務器的資源發出GET請求。每個響應都是一個json數組,它被解析成對象並保存到數據庫表中,之後將Intent廣播到啓動服務的Fragment,以查詢有問題的表並將對象顯示在列表中。所以,用一個獨特的類型的對象,但除此之外的每個片段的服務DBTABLE交易,該代碼是在每個片段-服務對基本相同:Android應用程序架構 - 如何避免片段服務代碼複製

NewsFragment, NewsPostsRequestService (deals with NewsPostObjects) 
UserFragment, UserRequestService (deals with UserObjects) 
FavoritesFragment, FavoritesRequestServices (deals with FavsObjects) 

等等。

如何避免代碼重複,以便一個片段和一個服務可以用於所有請求?一個選項是在一個狀態到作爲參數傳遞:

CustomFragment fragment = CustomFragment.newInstate(NewsState); 

,然後執行(僞代碼):

if(mState==NEWS) apiRequest("/news") 
else if(mState==USERS) apiRequest("/users") 

等。

不過,我非常想一個解決方案,其中片段和服務是完全獨立的,其資源的請求,db表他們的儲蓄來和對象類型的交易,並可以很容易地添加新的請求。這怎麼能實現?

+0

我對你的架構決策的一些問題。你爲什麼需要這項服務?你不能簡單地使用AsyncTask加載數據嗎?爲什麼你需要將數據存儲在數據庫中?數據是否需要持久? – Sameer

+0

@Sameer。我使用的是服務,以保持查詢任務完成獨立活動的,這樣的情況下,該活動由系統關閉工作仍然可以完成。是的,數據需要在用戶會話之間保持不變。 –

回答

2

我認爲你應該能夠解決繼承問題。爲通用代碼實現AbstractService和AbstractFragment,然後在每個變化的東西中使用抽象方法。

AbstractFragment<T> 
AbstractPostsRequestService<T> 
apiRequest(getRequestPath()) 
abstract String getRequestPath(); 


NewsFragment extends AbstractFragment<NewsPostObjects> 
NewsPostsRequestService extends AbstractPostsRequestsService<NewsPostObjects> 
String getRequestPath() {return "/news";} 

+0

感謝您的回答。是的,這是一種選擇,但它仍然涉及實施方法中的一些方法代碼重複。有沒有一種方法,讓我僅指定解析的對象類型,數據庫表和請求字符串? –