none
增量加载数据导致的崩溃(ISupportIncrementalLoading IBindableObservableVector UnhandledException) RRS feed

  • 问题

  • 有一个ListView,数据源是继承一个自己实现的基类,支持ISupportIncrementalLoading,IBindableObservableVector 接口的。

    但发现在设置数据源时,下面不同的两种方法会有不同的效果。

    最开始是这样的:

    CommentDataSource::CommentDataSource(Platform::String^ BKID) : _bkid(BKID) { assert(_bkid != nullptr); LoadData(); //auto data = ref new CommentAsyncBindData(); //this->AsyncItems = data; } void CommentDataSource::LoadData() { // AsyncItems属性是继承自AsyncBindDataBase(自己实现的异步加载基类) auto data = ref new CommentAsyncBindData();

    // 执行实际获取数据的过程

    this->AsyncItems = data; }

    // // 在代码中设置数据源 // commentListView->DataContext = ref new CommentDataSource(L"a3b324864");

    相当于先手动加载了一点数据,才设置到控件。这种做法运行了一段时间,至少还没有发现崩溃。

    但后来想,这种增量加载,应该可以自动加载最开始的数据的啊,我没有必要在构造的时候先获取一部分数据的(毕竟这里的获取和增量加载是重复的代码)。于是改成了下面这种:

    CommentDataSource::CommentDataSource(Platform::String^ BKID)
        : _bkid(BKID)
    {
        assert(_bkid != nullptr);
        //LoadData();
        auto data = ref new CommentAsyncBindData();
        this->AsyncItems = data;
    }

    果然是可以工作的。

    但测试过程中,竟然发现在刚进入页面的时候,时而会发生崩溃UnhandledException,概率还是挺大的(连着进入-后退-进入页面几次,基本就出现崩溃)。

    

    调用栈和输出窗口几乎没有任用有用的信息。

    查阅UnhandledException,大概说这是xaml框架引起的,确实也不会带有什么可用信息。建议还是应该在能捕获异常的地方去捕获。郁闷了。。。

    而换用最初的代码,再去折腾,上百次,都没有问题(当然我也不能确定这一定是没有问题的)。

    我刚开始怀疑是自动加载数据的具体执行步骤中除了问题,于是我就单步跟踪,但这里面我没有发现问题。待数据加载(是从服务器获取的列表)加载完毕,直至ISupportIncrementalLoading::LoadMoreItemsAsync完全返回都没有问题,之后进入系统库文件代码,这里面太多,一F5就挂掉了。

    对于这种问题,该如何排查呢?



    • 已编辑 PPStream 2013年6月24日 8:49 完善代码
    2013年6月24日 8:46

答案