私のような似たような質問があるかもしれませんが、長い間検索したところ、何も見つかりませんでした。
アクティビティと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_STATE
IntentBroadcastReceiverの両方がこのサービスを呼び出して、オントロジーをロードします。問題は、SDカードがマウントされた後(電話の起動時に)、OntologyPreLoaderService
オントロジーを正しくロードしますが、onHandleIntent
メソッドを終了すると、アプリケーションプロセスが終了するため、アクティビティまたは電話のBroadcastReceiverが呼び出すと、handler
サービスのフィールドは常にnullの場合、サービスはオントロジーを再度リロードする必要があります。
ただし、ロードが完了すると、サービスが作業を終了して再度ウェイクアップした場合でも、サービスはOntologyHandlerインスタンスを維持する必要があります。
あなたが私を理解してくれることを望むよ。