使持久对象可以使用的最佳方法

时间:2012-05-15 19:32:43

标签: android service broadcastreceiver

也许有一些像我这样的类似问题,但经过长时间的搜索,我找不到任何问题!

我有一个Object(OntologyHandler),它填充了一些由Activity和BroadcastReceiver使用的rdf文件。 这个OntologyHandler负载非常重,当我启动Activity时无关紧要,因为我有一个“Please Wait”消息。

但是当手机上有来电时,BroadcastReceiver会启动,所以它必须尽可能快地执行,加载OntologyHandler对象所需的7/8秒实际上是很多时间。

所以我想在启动手机后加载OntologyHandler一次,并且对于Activity或BroadcastReceiver的每次访问都保持快速可用。

你能告诉我任何建议吗?

---编辑---

实际上,我所拥有的是:

  • OntologyHandler:

    public class OntologyHandler {
        private static OntologyHandler instance;
    
        private OntologyHandler() {
            //loadOntology() is the method that spend a lot of time to terminate.
            loadOntology();
        }
    
        public synchronized static OntologyHandler getInstance()
        {
            if(instance == null)
            {
                instance = new OntologyHandler();
            }
            return instance;
        }
    
        public synchronized static void setInstance(OntologyHandler inst)
        {
            instance = inst;
        }
    
        public synchronized static boolean isInstanceLoaded()
        {
            return instance != null;
        }
    
        private void loadOntology()
        {
            //load the rdf files...
        }
    }
    
  • 第一次加载OntologyHandler的服务,由侦听android.intent.action.MEDIA_MOUNTED意图的BroadcastReceiver启动:

    public class OntologyPreLoaderService extends IntentService {
    
        private OntologyHandler handler;
    
            public OntologyPreLoaderService() {
                super(OntologyPreLoaderService.class.getName());
            }
    
            @Override
            protected void onHandleIntent(Intent intent) {
    
            if (handler == null) {
    
                //I use a thread because the Process is executed in the main thread of the app, 
                //so, if the user starts the Activity he has no black screen while loading Ontology, 
                //but a "Please wait" message in an AlertDialog, dismissed when the Activity can access the 
                //OntologyHandler.getInstance(); synchronized static method
                new Thread() {
                    public void run() {
                        handler = OntologyHandler.getInstance();
                    }
                }.start();
    
            } else {
                OntologyHandler.setInstance(handler);
            }
        }
    }
    

Activity和PHONE_STATE Intent BroadcastReceiver都会调用此服务来加载Ontology。 问题是,在安装SD卡后(在电话启动时),OntologyPreLoaderService正确加载Ontology但是,当完成onHandleIntent方法时,应用程序进程终止,因此当活动或电话BroadcastReceiver时调用它,服务的handler字段始终为null,服务必须重新加载Ontology。

但我想要的是,一旦加载,服务就会维护OntologyHandler实例,即使它结束了它的工作并再次重新唤醒或类似的东西。

希望你理解我。

1 个答案:

答案 0 :(得分:0)

您可以实现将OntologyHandler加载为手机启动时启动的Service的部分,这样可以将数据保存在内存中,以便在需要时使用应用的其他部分。

然而,保持大量的内存捆绑起来必然会导致问题。您是否可以重新评估您的应用程序,看看您是否可以用其他方式表示RDF文件中的数据,因此可以根据需要将它们加载到较小的部分?

了解您的应用程序要实现的目标会很有帮助。当特定患者打电话给医生的智能手机时,目标是显示患者的医疗档案吗?