0

私のような似たような質問があるかもしれませんが、長い間検索したところ、何も見つかりませんでした。

アクティビティとBroadcastReceiverによって使用されるいくつかのrdfファイルで満たされたオブジェクト(OntologyHandler)があります。このOntologyHandlerはロードするのに非常に重いです。「お待ちください」というメッセージがあるので、アクティビティをいつ開始してもかまいません。

ただし、BroadcastReceiverは電話に着信があるときに起動されるため、実行はできるだけ高速である必要があり、OntologyHandlerオブジェクトのロードに必要な7/8秒は実際にはかなりの時間がかかります。

そのため、電話を起動してからOntologyHandlerを1回だけロードし、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...
        }
    }
    
  • android.intent.action.MEDIA_MOUNTEDインテントをリッスンするBroadcastReceiverによって開始されたOntologyHandlerを初めてロードするサービス:

    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_STATEIntentBroadcastReceiverの両方がこのサービスを呼び出して、オントロジーをロードします。問題は、SDカードがマウントされた後(電話の起動時に)、OntologyPreLoaderServiceオントロジーを正しくロードしますが、onHandleIntentメソッドを終了すると、アプリケーションプロセスが終了するため、アクティビティまたは電話のBroadcastReceiverが呼び出すと、handlerサービスのフィールドは常にnullの場合、サービスはオントロジーを再度リロードする必要があります。

ただし、ロードが完了すると、サービスが作業を終了して再度ウェイクアップした場合でも、サービスはOntologyHandlerインスタンスを維持する必要があります。

あなたが私を理解してくれることを望むよ。

4

1 に答える 1

0

電話の起動時に起動さOntologyHandlerれる としてロードする部分を実装できます。これにより、アプリの他の部分が必要なときに使用できるようにデータがメモリに保持されます。Service

ただし、そのように大量のメモリを束縛しておくと、問題が発生する可能性があります。アプリを再評価して、RDF ファイル内のデータを別の方法で表現できるかどうかを確認して、必要に応じて小さな部分でロードできるようにすることはできますか?

アプリが何を達成しようとしているのかを理解しておくと役に立ちます。特定の患者が医師のスマートフォンに電話をかけたときに、患者の医療ファイルを表示することが目標ですか?

于 2012-05-15T20:26:52.007 に答える