本來想中午就更新一篇文章的,結果這都下午三點半多了,剛才一個小問題一直困擾了我很長時間,剛才經過努力終於是解決了(嗯,應該是解決了吧,還有待更多時間的測試)。
具體問題,我在我的應用程式的首頁面需要擷取手機的GPS位置資訊,並通過網路API轉換成地理位置,然後把這個值綁定到一個控制項上面顯示出來。 很簡單,不是麼,所以我就直接在首頁的Loaded裡面調用了這些需要的方法,其實寫這個功能用不了太多的代碼,但是當我寫完之後我發現,我的程式變得非常的不穩定,80%的情況下是好的,而有的時候介面就會卡住不動。具體表現為退出程式之後重新開啟,有的時候介面就處於卡死狀態,直到系統強行結束掉我的程式。甚至有的時候直接在VS裡面串連真機調試,就卡在首頁不動。
有的朋友該說了:你沒有用多線程吧?如果請求GPS和請求網路等等都在UI線程裡進行,那肯定是要卡死的啊。
我確定,我已經手工寫了新的進程了。我也試圖用斷點跟蹤調試到底是哪裡出現了問題, 但是終無所獲。
由於接近80%的情況下沒有異常反應,所以這個問題處理的優先順序並不高,但我知道有這麼一個BUG總感覺不爽,確實是很不爽啊。
直到一個小時之前,我突然想到瞭解決辦法:
我把上面在Loaded裡面做的事情,全部轉移到了OnNavigatedTo裡面來做,之後測試了數次,均表現正常(如果不出意外,相信我已經找到了正確的解決方案)。
上面羅嗦了一大堆,反思一下並引入正題:Loaded VS OnNavigatedTo
做WinForm或ASP.NET的朋友在處理頁面初始化的問題上一般都是習慣在Loaded裡面做事情,當然我也不例外。不過在WP7上,看來需要注意一下了。現在分析我剛才遇到的問題,我隱約覺得可能是Load裡寫的東西和載入介面的資料繫結產生了衝突,或者是資源死結,當然,這個具體原因我無法給出準確的判斷,這個只是感覺。
XXX_Loaded和OnNavigatedTo都是在頁面“載入”時觸發的(我這裡說的載入是指對使用者來說,即他們看到介面展示在他們之前),這個可以稱為他們的共同點,他們共同使用本頁面的資源。至於不同點,XXX_Loaded方法並非每次頁面啟用而執行,這個估計由系統調度,而OnNavigatedTo方法則在每次頁面啟用的時候都會執行。還有就是它們的先後順序,
我個人認為(為了怕誤導大家先寫“個人認為”,等查到確切資料再改)應該是Loaded在前,OnNavigatedTo在後,Loaded執行之時就是頁面正在載入的時候,OnNavigatedTo執行的時候應該是頁面完全載入完畢了。
剛才還準備查查資料,結果就有朋友提出OnNavigatedTo比Loaded早(感謝“阿幹@NET”),馬上寫了兩行程式測試了一下,發現確實如此,寫程式不能靠感覺啊~那剛才我遇到的問題,估計就是線程衝突而導致資源死結(繼續標註“可能是”),而OnNavigatedTo在前,似乎就對這種情況進行了避免。剛才寫完文章之後也百度了一下,發現很多朋友多認為頁面裡還是用OnNavigatedTo比Loaded好一些。
所以,以後涉及到介面上繫結資料的變數的值的擷取,最好還是寫到OnNavigatedTo裡面吧。當然,如果你想只執行一次,比如我上面的GPS位置只需要擷取一次就夠了,那也容易:
private bool _isFirst = true;
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (_isFirst)
{
//TODO:.......
_isFirst = false;
}
}