0

着信/発信通話を追跡し、通話記録をデータベースに保存するアプリケーションに取り組んでいます。昨日、アプリケーションが OS によって終了され、警告メッセージが表示されるシナリオを見ました(エラー: アプリケーションが応答していません)。アプリケーションがOSによって終了された後。アプリケーションは、着信/発信通話を再び聞くことができません。と思いきや、アプリの異常終了でアプリフォンリスナーが登録解除された。System.Exit(0)アプリケーション終了のOS 呼び出し

私がこのアプローチに従えば:-

public static void main(String[] args) 
{
    /** 
     * Registering the phone Listener. 
     * */
    Phone.addPhoneListener( new ConcretePhoneListener() );

   new SampleUIApp().enterEventDispatcher();
   }

この場合、アプリケーションの起動時に毎回、電話リスナーが登録されます。また、アプリケーション (Phone Listener) が複数回登録されています。単一のイン/アウト コールの手段

void callConnected( int aCallId ) 
callDisconnected( int aCallId ) 

この問題を解決するために、RunTime Store Management System を使用しています。このために、私は次のアプローチを使用しています:-

private static void registeringPhoneListener() 
{
    RuntimeStore mRuntimeStore = RuntimeStore.getRuntimeStore();
    final long GUID = 0xba9e3b33ac5fe37eL;

    String msPhoneListenerString = null;

    if(mRuntimeStore.get(GUID) != null)
    {
        Log.debug(  "PhoneListener is Already Implemented ## ");
    }
    else
    {
        Phone.addPhoneListener( new ConcretePhoneListener() );
        mRuntimeStore.put(GUID, "PhoneListener");   

          Log.debug("PhoneListener Implemented First Time ## " );           
    }
}

このアプローチは、OS によって異常終了するまで正常に機能します。RuntimeStoreManagemnet は null ではありませんが、Application Phone-listener は Derigester であるためです。

これを手伝ってください。

4

1 に答える 1

1

ここでは、あなたが示した以上のことが起こっているので、これが正しい答えであるとは確信していません. 私が確信しているのは、これが適切に機能するようにコードを変更する必要があるということです。

リスナー処理を誤用していると思われます。

通常、リスナーは、リッスンしているアプリケーションのコンテキストで実行されます。実際、リスナーは Phone アプリケーションの制御下で実行されています。リスナーコードでこれを壊したくありません(やっているように見えます)。そのため、リスナー コードは可能な限りタイト (効率的で壊れにくい) にする必要があります。この場合、メモリから、リスナーはイベント スレッドで実行されるため、コードがタイトであることを確認することに加えて、ブロッキング操作を行うべきではありません。また、データベースの読み取りがブロッキング操作としてカウントされる可能性があることに注意してください。

一般的な推奨事項は、リスナーができる限り少ないことを確認することです。最適な推奨事項は、リスナーがグローバル イベントを開始し、負荷の高い処理をアプリケーションで処理することです。

グローバルイベントに関する記事は次のとおりです。

http://supportforums.blackberry.com/t5/Java-Development/Global-Events-and-Global-Event-Listeners/ta-p/444814

理論について議論しましたが、ここで何が起こっているのでしょうか?

この場合、リスナーがブロックしていて、Phone アプリケーションを停止していると思われます。システムによって電話アプリケーションが再起動されることは間違いありません (電話アプリケーションがなければ、電話は何に使用されるのでしょうか!) ので、これに気付かないかもしれません。ただし、電話アプリケーションを再起動すると、リスナーがなくなるため、通知を受け取ることができなくなります。

したがって、Listener コードを修正して、Phone アプリケーションのダウンを確実に停止する必要があると思います。

次の 2 つの選択肢があると思います。

  1. グローバルイベントを使用して処理を独自のアプリケーションに移動します (私の推奨事項)
  2. ブロッキング操作をイベント スレッドから移動します。

どちらかを実装すると、アプリケーションが電話アプリケーションを壊すのを止める必要があり、問題は解決されます。

于 2013-09-20T08:46:54.253 に答える