2013-05-22 55 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

相关问题