【问题标题】:Singleton Class ArrayCollection within Flashbuilder (Mobile) empty?Flashbuilder(移动)中的单例类ArrayCollection为空?
【发布时间】:2011-08-30 09:13:55
【问题描述】:

我目前正在尝试实现一个 Singleton 类,以存储项目的 ArrayCollection,然后我可以在我的应用程序的整个生命周期中访问和操作这些项目。我创建了下面的 Singleton 类,旨在保存 ArrayCollection 信息:

package valueObjects
{
    import mx.collections.ArrayCollection;  

    [Bindable]
    public class Model
    {
        private static var instance:Model = new Model();

        public var ids:ArrayCollection = new ArrayCollection();

        public function Model()
        {
            if(instance)
            {
                trace("New instance cannot be created. Use Singleton.getInstance()");
            }
        }

        public static function getInstance():Model
        {
            return instance;
        }
    }
}

然后,我在我的应用程序的 Main Deafult 页面上创建了以下代码,以便在启动应用程序后立即填充 ArrayCollection:

        import valueObjects.Model;          

        protected var models:Model = new Model();

                private function loop():void
        {
            var index:int;
            for( index = 0; index < compsCollection.length; index++ )
            {
                trace( "Element " + index + " is " +  compsCollection[index].comp_id );
                            models.ids.addItem(compsCollection[index].comp_id);
                trace(models.ids.length);
            }               
        }

Singleton 类中的 ArrayCollection 正在被填充,因为我进入循环的跟踪语句清楚地显示了 ArrayCollection 中数据的构建。但是,当我移动到应用程序中的另一个视图时,我尝试使用以下代码在 Singleton 类中访问此 ArrayCollection:

import valueObjects.Model;

protected var models:Model = Model.getInstance();
protected var test:ArrayCollection = new ArrayCollection();

protected function view1_viewActivateHandler(event:ViewNavigatorEvent):void
            {

                var index:int;
                trace("Array Length =" + models.ids.length);
                for( index = 0; index < models.ids.length; index++ )
                {
                    trace( "Element " + index + " is " + models.ids[index].comp_id );
                    test.addItem(models.ids[index].comp_id);
                }   
                testbox.text = test.toString(); 
            }

现在我遇到的问题是,当我尝试访问这个 ArrayCollection(ids) 时,由于某种原因它似乎是空的。我已经包含了一个跟踪语句,它还说 ArrayCollection 的长度是“0”。有人可以帮忙吗??

【问题讨论】:

    标签: android apache-flex singleton flash-builder


    【解决方案1】:

    这样试试

    public static function getInstance():Model
    {
        if(instance == null)
          instance= new Model();
    
        return instance;
    }
    

    这里不需要赋值给变量

    protected var models:Model = Model.getInstance();
    

    直接使用喜欢

    Model.getInstance().ids = new ArrayCollection();
    

    试试这个, 这可能对你有帮助。

    【讨论】:

    • 感谢您的快速回复,我已将单例类 (getInstance) 更改为您在第一段代码中建议的内容,其余部分保持不变,然后我从试图访问 ArrayCollection 的视图,最后我将所有访问参数更改为 ArrayCollection,就像你说的“Model.getInstance().ids.length”。一旦我对此进行了测试,由于某种原因,我仍然会得到 ArrayCollection 长度返回 0。这真的很烦人,你能再帮忙吗??
    • 我也研究过使用 FlexGlobals,但是我无法让这些在我的主默认视图上正确查看 ArrayCollection,因为它说它没有设置或启动,我非常感谢您对排序的帮助问题,因为我真的需要在我的应用程序中访问全局变量。谢谢
    • @user723858 现在我知道了,将实例设为公开
    • 嗨,我刚刚在单例类中更改了以下行:“public static var instance:Model = new Model();”这现在使它成为“私人”的“公共”instewad。但是,应用程序在我启动它时立即崩溃,提示“错误 #1009:无法访问空对象引用的属性或方法”。这发生在我刚刚更改的线路上,有什么想法还是我做错了哈哈?谢谢
    • 不要在此处创建实例 new Model();因为我们可以在实例中实现。我认为静态变量首先创建。所以你有错误
    【解决方案2】:

    在您的主类中,将 new Model() 更改为 Model.getInstance()。但是,您仍处于项目的初始阶段,您有机会避免单例将给您带来的问题http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/。我鼓励您使用依赖注入(直接使用 data 属性,或者更抽象地使用依赖注入框架,例如 Robotlegs、Swiz、Mate 或 Parsley)。

    【讨论】:

    • 您是否建议我使用持久性管理器将 ArrayCollection 存储在我的项目中?
    • 我是说你可以这样做的一种方法是在 pushView 的第二个参数中引用你的 AC。或者您可以使用一个框架,它监视要添加到显示列表的新视图并为其提供所需的内容。或者,您可以通过侦听 ADDED_TO_STAGE 创建类似于框架的东西,捕获新实例,并为其提供所需的信息。有很多事情你可以做,不会让你陷入使用单身人士邀请的泥潭。
    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多