在MvvmCross解決方案中,我有一個單例服務類,它從Web服務獲取項目並更新公共ObservableCollection。它每五秒鐘執行一次,可能會添加或刪除項目或更改其屬性。關於MvvmCross中ObservableCollection何時何地使用的建議
我也有一個ViewModel有一個公共屬性設置爲服務的ObservableCollection。視圖綁定到ObservableCollection,以便在添加,刪除或更改項目時,視圖應該更新以顯示此內容。
但是,正如預期的那樣,我得到一個線程異常,因爲ObservableCollection正在被主/ UI以外的線程更新,因此綁定無法更新UI。
在服務內我沒有InvokeOnMainThread
調用可用,所以在更新ObservableCollection時,沒有明顯的跨平臺方式來回到主線程。另外,這樣做似乎是錯誤的 - 服務不應該關注UI問題(而ViewModel可以)。
另外我對暴露服務中的事件感到有點緊張,以防這導致ViewModels不被垃圾收集。我注意到,在@ slodge的N + 1系列http://mvvmcross.wordpress.com/中,他正在使用一種消息傳遞服務,以避免這種情況。
所以一個可能的解決方案可能是發佈消息與最新的項目列表,並使ViewModel訂閱消息並通過比較消息內容與UI線程更新自己的ObservableCollection。但這似乎有點笨重。
任何建議,以實現這一點的最佳方式將不勝感激 - 謝謝。
新的'EnableCollectionSynchronization'看起來有趣,但你是對的 - 它看起來很複雜,不得不實現鎖定與編組事件一樣麻煩。好吧,看起來像A IS畢竟是可行的,我猜如果ViewModel沒有處理它的任何事件,那麼它將不會通過服務引用而保持活動。所以,再次感謝全面的回答以及如何從服務返回主線程的提示。 –
我試過這個'MvxMainThreadDispatcher.Instance.RequestMainThreadAction',但它沒有幫助:(還有什麼可以做的? – DanilGholtsman
https://stackoverflow.com/questions/47728293/on-android-device-ui-update-happens - 僅在用戶交互後的完整問題 – DanilGholtsman