2011-12-28 117 views
4

我有一個類擴展了應用程序在Android tabHost應用程序。在App類中,我一直在放置方法和變量,否則我需要在每個類中重新創建這些方法和變量。一種方法是從數據庫讀取數據並將結果存儲在ArrayList中(例如名字,姓氏)。而不是重新讀這個數據庫,並重新創建每個需要信息的標籤視圖的代碼,我堅持方法和ArrayList在擴展應用程序(myAppClass)的類。這樣,通過在onCreate()中的任何選項卡視圖中設置mAC = (myAppClass) getApplicationContext(),我可以引用myAppClass中的所有get ..()和set ..()方法。靜態方法與類擴展android.app.Application?

我原來的計劃是使用靜態方法和變量的共享類,但我讀了很多「不這樣做」的線程,所以決定去應用程序路線。現在,我遇到了一種情況,我試圖在項目庫中使用myAppClass,但得到關於android.app.Application cannot be cast to...的錯誤如果我將myAppClass更改回靜態方法/變量(並且不擴展應用程序),事情就會起作用,但這應該是假定的是一個很大的禁忌。有沒有另一種方法來做到這一點?不確定Android是否通過引用傳遞了所有內容,但是我最好通過在方法/類之間來回傳遞巨大(數千個對象/成員)ArrayLists來重新實現整個應用程序?

+0

只有一個應用程序實例。不需要使用getter和setter。只需在子類應用程序中使用靜態方法/變量並以這種方式使用它們:MyApplication.myMethod()... – 2011-12-28 17:01:49

回答

6

我原來的計劃是使用靜態方法和變量的共享類,但我讀了很多「不這樣做」的線程,所以決定去應用程序的路線。

「不這樣做」通常是針對全球範圍內任何事物的推薦,因此將覆蓋靜態數據成員以及自定義Application。兩者都可能是內存泄漏的來源。

現在,我碰到的情況下,我嘗試使用myAppClass在一個項目庫,但得到的誤差約android.app.Application不能轉換爲...

你主機項目中的清單可能並未聲明使用庫的Application實現。

這應該是一個很大的禁忌

同樣,靜態數據成員不超過自定義Application糟糕的是,在很多情況下是較好的。

是否有其他方法可以做到這一點?

請勿使用Application或靜態數據成員。

通過在方法/類之間來回傳遞巨大(數千個對象/成員)ArrayLists來重新實現整個應用程序會更好嗎?

你最好擁有一個持久的數據模型,比如數據庫。使用靜態數據成員作爲持久數據模型的緩存是可以的,只要你非常小心你的內存管理。

+0

感謝您的回覆。你用AndroidManifest釘住了它。用靜態的ArrayList對象管理內存需要做什麼不同?應用程序結束時不清除Android? – wufoo 2011-12-28 18:51:31

+0

@wufoo:「應用程序結束時不清除Android?」 - 當進程最終被終止時,內存將被清理,但之前的內存泄漏仍然會導致應用程序因堆空間用盡而崩潰。 – CommonsWare 2011-12-28 20:01:44

+1

謝謝。 Eclipse Memory Analyzer是查找泄漏的好工具嗎? 2yr舊線程在這裏:http://stackoverflow.com/questions/1147172/what-android-tools-and-methods-work-best-to-find-memory-resource-leaks – wufoo 2011-12-28 22:01:07