Windows Phone的邏輯刪除和非同步處理

來源:互聯網
上載者:User

你們是否曾經編寫過一個應用程式,在即將完成之時,卻希望自己從未寫過這個應用程式?正是這種直覺,讓您覺得架構不太好。簡單的改變似乎遙不可及,或者至少要耗費長得多的時間。然後就是 bug。哦,有 bug!您是一個正直的編程員。您怎麼寫出有這麼多 bug 的東西呢?

聽起來是不是很熟悉?嗯,當我編寫我的第一個 Windows Phone 應用程式 NPR Listener 就是這種情況。NPR Listener 與全國公用廣播電台 Web 服務 (npr.org/api/index.php) 進行通訊,以擷取其電台節目的可用新聞報道列表,然後讓使用者在 Windows Phone 裝置上收聽這些新聞報道。當我開始編寫時,我進行了大量 Silverlight 開發,並對自己將知識和技能移植到 Windows Phone 上感到非常滿意。很快我就完成了第一個版本,並提交到 Marketplace 認證流程。那段時間我就在想,“哦,這很簡單嘛”。但是之後我認證失敗了。失敗的情況是這樣的:

步驟 1: 運行您的應用程式。

步驟 2: 按下開始按鈕,進入電話的首頁。

步驟 3: 按下“後退”按鈕,返回您的應用程式。

當您按下後退按鈕時,您的應用程式應當正常恢複,在理想情況下,應當讓使用者回到退出您的應用程式時的螢幕。在我的個案中,測試人員導航到全國公用廣播程式(例如“All Things Considered”),單擊進入任何一個最新報道,然後按下開始按鈕,進入裝置的主畫面。當測試人員按下後退按鈕返回我的應用程式時,應用程式恢複了,但是充滿了 NullReferenceExceptions。這可不是什麼好事。

現在我告訴您一些我如何設計基於 XAML 的應用程式的事情。就我而言,全都是 Model-View-ViewModel 模式,我的目標是在 XAML 頁與應用程式的邏輯之間做到近乎瘋狂的分隔。如果在我的頁面的 codebehinds (*.xaml.cs) 中要有什麼代碼的話,最好有個充分的理由才行。造成這一點在很大程度上是因為我對單元測試近乎變態的需求。單元測試是至關重要的,因為可以有助於知道應用程式什麼時候是有效,更重要的是便於重構代碼並改變應用程式的工作方式。

所以如果我對單元測試如此熱衷,為何我得到這些 NullReferenceExceptions 呢?問題在於,我編寫 Windows Phone 應用程式就像 Silverlight 應用程式一樣。當然,Windows Phone 就是 Silverlight,但是 Windows Phone 應用的生命週期和 Silverlight 應用程式的生命週期完全不同。在 Silverlight 中,使用者開啟應用程式,進行互動,直至完成,然後關閉應用程式。相反在 Windows Phone 中,使用者開啟應用程式,使用應用程式,然後在應用程式與作業系統或任何其他應用程式之間來回跳轉。他使用者離開您的應用程式,應用程式便停用了或“邏輯刪除”。當您的應用程式被邏輯刪除後,則不再運行,但是應用程式的導航“後退堆棧”——應用程式中按照訪問順序排列的頁面——在裝置上仍然可用。

您可能注意到在 Windows Phone 裝置上,您可以在多個應用程式中導航,然後反覆按後退按鈕,以反向順序在這些應用程式中向後行進。這就是導航後退堆棧在起作用,每次您進入一個不同的應用程式,那個應用程式便從保持的邏輯刪除資料中重新啟用。當您的應用程式將要被邏輯刪除時,應用程式便會從作業系統收到一條通知,告知其將要被停用並應當儲存其應用程式狀態,以便稍後重新啟用。圖 1 顯示了 App.xaml.cs 中用於啟用和停用應用程式的一些簡單代碼。

圖 1 App.xaml.cs 中簡單邏輯刪除的實施

             // Code to execute when the application is deactivated (sent to background).
             // This code will not execute when the application is closing.
             private void Application_Deactivated(object sender, DeactivatedEventArgs e)
   {
     // Tombstone your application.
             IDictionary<string, object> stateCollection =
       PhoneApplicationService.Current.State;
     stateCollection.Add("VALUE_1", "the value");
   }
   // Code to execute when the application is activated
   // (brought to foreground).
             // This code will not execute when the application is first launched.
             private void Application_Activated(object sender, ActivatedEventArgs e)
   {
     // Un-tombstone your application.
             IDictionary<string, object> stateCollection =
       PhoneApplicationService.Current.State;
     var value = stateCollection["VALUE_1"];
   }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: