2013-05-22 91 views
2

使用Xamarin和MvvmCross,其中在Android客戶端查看如何訂閱郵件從核心項目,我想這個代碼沒有得到執行:來自Android客戶端訂閱MvxMessage

public HomeView(IMvxMessenger messenger) 
{ 
    _messenger = messenger; 

    // Subscribe to inter-app message "ApplicationError_Message" 
    _messageToken = messenger.SubscribeOnMainThread<ApplicationError_Message>(Display_Error); 
} 

回答

6

我不能「噸真的按照你的示例代碼 - 它並沒有真正解釋:

  • 如何你創建HomeView
  • 它是如何獲得其信使實例傳遞給它。
  • 什麼產生ApplicationError_Message消息
  • 你是如何理解與否的信息是或不是到達

作爲一個快速測試我修改Android HomeView的InternetMinute樣品中 - https://github.com/slodge/MvvmCross-Tutorials/tree/master/InternetMinute

using Android.App; 
using Android.OS; 
using Cirrious.CrossCore; 
using Cirrious.MvvmCross.Droid.Views; 
using Cirrious.MvvmCross.Plugins.Messenger; 
using InternetMinute.Core; 

namespace InternetMinute.Droid.Views 
{ 
    [Activity(Label = "Internet time is ticking")] 
    public class HomeView : MvxActivity 
    { 
     private MvxSubscriptionToken _token; 

     private IMvxMessenger _messenger; 
     protected IMvxMessenger Messenger 
     { 
      get 
      { 
       _messenger = _messenger ?? Mvx.Resolve<IMvxMessenger>(); 
       return _messenger; 
      } 
     } 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 
      SetContentView(Resource.Layout.HomeView); 
     } 

     protected override void OnResume() 
     { 
      base.OnResume(); 
      _token = Messenger.SubscribeOnMainThread<TickMessage>(OnTick); 
     } 

     protected override void OnPause() 
     { 
      Messenger.Unsubscribe<TickMessage>(_token); 
      _token = null; 
      base.OnPause(); 
     } 

     private int _i = 0; 
     private void OnTick(TickMessage obj) 
     { 
      Mvx.Trace("Tick received {0}", ++_i); 
     } 
    } 
} 

這似乎工作正常 - 我得到了我期待的蹤跡。

也許你的SubscribeOnMainThread沒有訂閱正確的消息類型 -​​ 編譯器推斷什麼類型?

+0

這是有效的 - 就我的代碼而言,我期待框架在構造函數中注入信使,但正如我從您的示例中可以看出,它不會那樣做,並且需要使用Mvx.Resolve (),然後訂閱OnResume中的消息並在OnPause中取消訂閱。謝謝! – samneric

+0

那麼你看到了什麼 - 一個空引用異常?還是你提供了多個構造函數?你可以在問題中提供的信息越多,我就會越好地嘗試定位我的答案 - 謝謝:) 至於OnPause/OnResume,這只是我的例子所做的 - 對你的應用程序有什麼作用取決於生命週期的用途你的應用程序,你的活動和你的消息 - 這取決於你的代碼:) – Stuart

+0

我不知道在哪裏訂閱消息,所以我遵循了與.Core PCL中使用的相同的方法 - 即我創建了一個構造函數IMvxMessenger輸入參數,並預計它將由MvvmCross注入。調試完成後,我發現構造函數從未被解僱,於是我知道MvvmCross在Droid應用程序中沒有這樣的工作方式。我只需要知道正確的方法來獲得您所回答的MvxMessenger。我想我需要一個N + x教程或一些示例 - 您提供的GitHub鏈接 - 非常感謝! – samneric

相關問題