none
启用发短信的功能后,点击“返回”后发现全局变量都被清空了。 RRS feed

  • 问题

  • 新手,我就将出现的现象描述一下。

    这是我在代码里启用发短信的功能。

    SmsComposeTask sct = new SmsComposeTask();
                sct.To = App.ViewModel.Items[index].Broker.Mobile;
                sct.Body = "Message Body";
                MessageBox.Show(App.ViewModel.Items.Count.ToString());
                sct.Show();

    会跳转到发短信的面板,并且输入面板显示后又立即隐藏了。

    然后我点击“返回”按钮,会出现 “正在恢复....”的提示,

    悲剧的是不能回到之前的那个页面了,因为之前的那个页面里用到了一个全局变量,在用这个变量的时候报“NullReferenceException“的错误。

    之前没有用Panorama控件的时候点击返回是不会出现这个错误的,用了这个控件之后才有这个问题。

    希望有人能帮我解答一下,刚接触winphone的开发,谢谢!


    • 已编辑 hyhe 2012年5月26日 13:49
    2012年5月25日 12:24

答案

  • 1、检查自己开发的是7.0还是7.1代码,如果是7.1,则发短信时程序处于休眠状态,变量不应该被清除的。如果是7.0,建议你升级为7.1,现在微软强制所有手机升到7.1才能访问MaketPlace

    2、确认项目属性的 调试 里的 在调试且停用是执行逻辑删除  未被选中,否则项目不会休眠而是直接进入墓碑状态

    • 已标记为答案 hyhe 2012年5月29日 2:42
    • 取消答案标记 hyhe 2012年5月30日 7:08
    • 已标记为答案 hyhe 2012年5月30日 7:19
    2012年5月28日 13:41

全部回复

  • 要具体看是哪个变量导致了NullReference。

    出现 “正在恢复....”的提示,是因为程序Deactivated后又重新Activated。Deactivated后,之前的实例都不存在了,所有的页面对象都销毁了,再Activated时会重新调用构造函数,但只会调用你离开时的那个页面的构造函数。如果你的全局变量来自于其他页面,那么有必要在Deactivated的时候保存这个变量到独立存储或者Application State中,再Activated的时候才能取到值。

    另外需要注意的一点,不要把SmsComposeTask定义成一个局部变量,而是定义成页面类的成员变量。


    2012年5月27日 12:45
  • 1、检查自己开发的是7.0还是7.1代码,如果是7.1,则发短信时程序处于休眠状态,变量不应该被清除的。如果是7.0,建议你升级为7.1,现在微软强制所有手机升到7.1才能访问MaketPlace

    2、确认项目属性的 调试 里的 在调试且停用是执行逻辑删除  未被选中,否则项目不会休眠而是直接进入墓碑状态

    • 已标记为答案 hyhe 2012年5月29日 2:42
    • 取消答案标记 hyhe 2012年5月30日 7:08
    • 已标记为答案 hyhe 2012年5月30日 7:19
    2012年5月28日 13:41
  • 1、检查自己开发的是7.0还是7.1代码,如果是7.1,则发短信时程序处于休眠状态,变量不应该被清除的。如果是7.0,建议你升级为7.1,现在微软强制所有手机升到7.1才能访问MaketPlace

    2、确认项目属性的 调试 里的 在调试且停用是执行逻辑删除  未被选中,否则项目不会休眠而是直接进入墓碑状态

    是的,升级到7.1后这些问题都解决了,之前有休眠时间过长也会崩掉的情况。
    2012年5月29日 2:42
  • 升级到7.1虽然有了多任务机制,但不能保证不进入墓碑机制,所以这个地方还是有可能崩溃。

    在项目的debug面板中把Tombstone upon deactivation while debugging勾掉是不推荐的做法,因为勾选上恰恰能测出进入墓碑化才会出现的问题。

    另外,墓碑化(你所说的休眠)时间的长短,不会对此有任何影响,进入墓碑化状态一秒钟和一个小时是一样的,进不进入墓碑化也不是用户或开发者能决定的,完全取决于操作系统的策略。楼主不防补一下这方面的知识。

    2012年5月29日 14:47
  • 升级到7.1后,虽然不会再崩溃掉了,但是出现了新的问题,我有一串列表是通过动态获取数据绑定上的,如果手机长时间(吃完一顿饭的时间)不用,解锁后,发现列表里的数据没有了。如果像论坛里说的,在每次进入deactive的时候保存当前页的状态,那我有好几个页面,并且页面里的数据好多都是通过动态绑定的,是不是得对每项数据作保存?而且我看开发文档上说,升级到7.1后,只有当前台应用程序内存不足,才会去销毁最先进入休眠状态的应用程序的页面对象,问题是我只开了一个应用程序对象就被销毁了,谁能给我解释一下原因呢?

    2012年5月30日 7:02