更改Windows Phone 8应用程序中的Image.Source属性会导致邻近事件订阅停止工作

时间:2013-07-03 14:19:32

标签: windows-phone-8 nfc

非常简单的repro应用程序 - 在Visual Studio中从模板创建了一个新的Windows Phone 8 C#应用程序,在内容面板中添加了一个Image,然后订阅了NDEF邻近消息,如下所示:

// Constructor
    public MainPage()
    {
        InitializeComponent();

        ProximityDevice device = ProximityDevice.GetDefault();
        if (device != null)
        {
            device.SubscribeForMessage("NDEF", handler);
        }
    }

    private void handler(ProximityDevice sender, ProximityMessage message)
    {
        Debug.WriteLine("Received message");
        Dispatcher.BeginInvoke(() =>
            {
                myImage.Source = new BitmapImage(new Uri("Assets/test.png", UriKind.Relative));
            });
    }

第一个事件正常工作(图像源已成功更改)。但是,在此事件触发后,如果我触摸另一个NFC标签,它将不再触发。如果我删除了更新图像源的调用,则会在每次触摸时触发。

我无法理解为什么会有任何互动。我正在测试的手机是诺基亚Lumia 620。

1 个答案:

答案 0 :(得分:0)

在黑暗中拍摄:尝试在某个地方继续引用ProximityDevice。使它成为类的成员并在构造函数中赋值。

class MainPage : PhoneApplicationPage
{
    private ProximityDevice device;
    public MainPage()
    {
        InitializeComponent();

        device = ProximityDevice.GetDefault();
        if (device != null)
        {
            device.SubscribeForMessage("NDEF", handler);
        }
    }
    ...
}

正如评论中正确提到的,这是由垃圾收集器引起的,垃圾收集器收集ProximityDevice的实例。创建new BitmapImage时,内存消耗会增加,这会触发GC进程。这就是为什么当你不创建图像时没有这样的问题。