前言 - 我創建的代碼到目前爲止已經提供了所需的用戶界面,我的問題是關於手機資源以及是否存在「更好」的實現。另外,我對Android開發相對較新,可能會誤解一些基本概念。Android - 重複片段交易和電話資源(複雜)
我正在開發帶有選項卡的應用程序,並且一些選項卡有多個視圖。目前,每個視圖都由片段管理,當用戶在選項卡上並打開新視圖時,視圖會水平轉換。
(該應用程序是現有iPhone應用程序的Android端口,儘管我工作的人員很容易理解需要將Android應用程序製作爲儘可能原生Android的應用程序,但他們需要基本的用戶界面和控制保持不變,這樣,如果iPhone用戶購買了Android手機併購買了其應用的另一個副本,則不存在根本性差異)。
然而,主選項卡不同 - 它會自行重新加載。該應用程序本質上是一個學習助手;想象一下,每個視圖都是代表信息的卡片,以及用戶是否翻閱卡片。
這是通過讓'卡片'片段請求片段管理器分離然後重新附加它自己來完成的。這是通過調用在執行所述FragmentActivity的方法來實現以下的(從實際的代碼簡化):
FragmentTransaction ft = .... .beginTransaction();
ft.setCustomAnimations(int out,int in)
ft.detach(relevantFragment);
ft.attach(relevantFragment);
ft.commit();
.... .executePendingTransaction();
其中 '出' 是fromXDelta = 「0」,toXDelta = 「 - 100%」
and'in'isXDelta =「100%」,toXDelta =「0」
因此,舊視圖向左滑出,同時新視圖從右側滑入。
這工作得很好,事實上就用戶體驗而言,它正是我想要的。然而,我們正在重新加載的片段具有複雜的視圖層次結構,我對片段的理解是整個事情將在每次轉換時被垃圾收集和重新實例化,用戶可能很容易調用大量次(100+),同時使用應用程序進行學習。
幾乎所有我讀過的東西都表明我應該避免沉重的對象創建/收集,因爲它會導致我的應用程序吞噬用戶的電池,而不管處理器是否足夠強大,無任何視覺滯後。
。
實際問題:有什麼辦法來模擬這種行爲不強制手機完全破壞並重新創建每個視圖秒爲用戶點擊瀏覽的看法?
事情我已經考慮:
消除交易/動畫,只是有段負荷的新信息。這當然很容易,但不是我的僱主想要的。
在XML中創建視圖層次結構的兩個相同副本,並使用自定義ScaleAnimation嘗試模擬此行爲,從View.VISIBLE和View.GONE來回切換它們。我不確定這是否會起作用,但乍一看似乎相當......馬虎。
這是一個不必要的和/或愚蠢的優化,我不應該擔心,由於手機和/或Android系統的運作方式,我根本沒有意識到我在浪費時間。
任何有關操作系統工作方式的建議,建議或說明都會得到很大的讚賞。
感謝您的回覆。 onCreateView()毫無疑問每次附加片段時都被調用,而不依賴於它作爲單個對象被實例化的事實。大部分設置視圖的業務都是在onCreateView()中完成的,如果沒有調用,我會轉換到包含與前一個相同信息的新視圖。這由代碼中已經存在的各種日誌記錄來證實。我會結帳Traceview。 (然後可能只是不用擔心) – HeMightBeTodd 2012-03-25 18:51:49
@HeMightBeTodd:然後你可以嘗試自己緩存視圖。我期望'Fragment'做到了 - 它確實在'setRetainInstance(true)'路徑中。 – CommonsWare 2012-03-25 19:04:39
經過幾次測試後,它看起來像片段數據更新和視圖轉換的總時間,大約70%的包含CPU時間被ViewRoot使用。performTraversals(),在onCreateView()中佈局通貨膨脹期間調用要求最高的子ViewRoot.draw()(父代的80%)和View.measure()(父代的15%)。這與直接與我的應用程序直接相關的最昂貴的業務邏輯相比,2個對SQL數據庫的調用佔用了3.5%的時間。 – HeMightBeTodd 2012-03-25 19:50:34