Android 让持久对象随时可用的最佳方法

Android 让持久对象随时可用的最佳方法,android,service,broadcastreceiver,Android,Service,Broadcastreceiver,也许有一些类似的问题,像我一样,但经过长时间的搜索,我没有找到任何 我有一个对象(OntologyHandler),其中填充了一些rdf文件,活动和广播接收器使用这些文件。 这个本体论处理程序的负载非常重,我什么时候开始活动并不重要,因为我有一条“请稍候”的消息 但是BroadcastReceiver是在手机上有来电时启动的,因此它必须以尽可能快的速度执行,并且加载OntologyHandler对象所需的7/8秒确实是很长的时间 因此,我想在启动手机后只加载一次OntologyHandler,并

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

我有一个对象(OntologyHandler),其中填充了一些rdf文件,活动和广播接收器使用这些文件。 这个本体论处理程序的负载非常重,我什么时候开始活动并不重要,因为我有一条“请稍候”的消息

但是BroadcastReceiver是在手机上有来电时启动的,因此它必须以尽可能快的速度执行,并且加载OntologyHandler对象所需的7/8秒确实是很长的时间

因此,我想在启动手机后只加载一次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\u上的
    intent:

    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都调用此服务来加载本体。 问题是,在SD卡挂载后(在手机启动时),
OntologyPreLoaderService
正确加载了本体,但当完成
OnHandleContent
方法时,应用程序进程终止,因此当活动或手机广播接收器调用它时,服务的
处理程序
字段始终为空,服务必须重新加载本体

但我希望,一旦加载,服务将维护OntologyHandler实例,即使它结束工作并再次唤醒或类似的事情


希望您理解我。

您可以将加载
OntologyHandler
的部分实现为
服务,在手机启动时启动,该服务将在内存中保存数据,以便应用程序的其他部分在需要时使用

然而,将一大块内存像这样捆绑起来肯定会导致问题。你能重新评估你的应用程序,看看你是否能用另一种方式来表示RDF文件中的数据,这样它们就可以根据需要以更小的部分加载吗


了解你的应用程序想要实现的目标会很有帮助。目标是在特定患者呼叫医生的智能手机时显示患者的医疗文件吗?

您好,谢谢回复。你写的关于服务的东西就是我现在拥有的。参见我在问题中添加的---编辑---段落。我不能忽视RDF的使用,因为它是这个(大学)项目的中心论点。此应用/服务的目标是让用户定义手机在特定环境中的行为(安全策略)。例如,“当我在工作会议期间(通过电话日历)接到朋友的电话(组“朋友”中的电话联系人),我会自动拒绝通话/静音铃声/发送忙信息ecc…”。希望你能理解我。您好。好的,这是有道理的,但是这些规则不可能要求一个文件太大以至于需要8秒钟才能加载。我该怎么说呢,伙计?rdf文件是4个,正如我所说,处理程序的负载非常重,可能是因为加载引擎(称为Androjena,Android的ApacheJena移植)进行了一些语义控制。但是一旦创建了本体模型,对它的查询就会很快。我想加载OntologyHandler实例并将其保存到一个文件中(它的加载速度可能比rdf加载速度快,因为它是POJO,不需要进行语义控制),并在每次手机关机时删除它,不知道该做什么!您能将RDF数据转换成Sqlite数据库吗?一旦加载,OntologyHandler会消耗多少内存?