Flashbuilder(Mobile)中的Singleton类ArrayCollection为空?

时间:2011-08-30 09:13:56

标签: android flex singleton flash-builder

我目前正在尝试实现一个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作为我在循环中输入的trace语句清楚地显示了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)时,由于某种原因它似乎是空的。我已经包含了一个trace语句,该语句还表明ArrayCollection的长度为“0”。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

试试这个

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

    return instance;
}

这里不需要分配变量

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

直接使用

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

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

答案 1 :(得分:0)

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