2

こんにちは、助けてくれてありがとう:

Java システムを Android に移植したいのですが、透過的なスタンドアロン サービスを介してサード パーティのアプリで利用できるようにしたいので、システム ライブラリのようになります。このシステムは、サード パーティ アプリによって処理されたドキュメントを解釈し、結果をサード パーティ アプリに返す VoiceXML インタープリターです。これらのドキュメントの解釈には、任意の時間、場合によっては非常に長い時間がかかる場合があります。

現在、すべての作業を行うインタープリターを作成するサービスがあります。これは、startJVoiceXML() というメソッドで行います。

問題は、サービスが作成されてから約 20 ~ 30 秒後に ANR で Android によってサービスが強制終了されることです。しかし、そのメソッドで重い作業 (しばらく前のコードのみ) を行わなければ、サービスは実行されたままになり、それよりも長い時間で強制終了されることはありません。

必要なことを行うためにスレッドを作成する必要がありますか? 詳細な説明のために、コードにいくつかのコメントを入れます。

ありがとう!

    public synchronized void startJVoiceXML(final URI uri) throws JVoiceXMLEvent, InterruptedException
    {
    AndroidConfiguration config = new AndroidConfiguration();
    jvxml = new JVoiceXmlMain(config);
    jvxml.addListener(this);
    jvxml.start();
    int a=0;

            //the wait is not the problem, the jvxml object run method calls jvxmlStarted in the service that does a .notifyAll() on this thread
    this.wait();    

            //this while is just to "do" some long running operation in order to emulate the Interpreter behaviour
    while(a<1000)
    {
        Thread.sleep(500);
        Log.e("JVoiceXML","esto en el while");
        a=a+1;
    }

    }

    public synchronized void jvxmlStarted() {
     this.notifyAll();
    }
4

1 に答える 1

2

ここで説明されているように、CPU を集中的に使用するコードを別のスレッドで実行する必要があります。

サービスは、そのホスティング プロセスのメイン スレッドで実行されます。サービスは独自のスレッドを作成せず、別のプロセスで実行されません (特に指定しない限り)。これは、サービスが CPU を集中的に使用する作業やブロック操作 (MP3 の再生やネットワークなど) を行う場合、その作業を行うためにサービス内に新しいスレッドを作成する必要があることを意味します。別のスレッドを使用することで、アプリケーションが応答しない (ANR) エラーのリスクが軽減され、アプリケーションのメイン スレッドはアクティビティとのユーザー インタラクション専用のままにすることができます。

于 2012-05-21T05:19:45.050 に答える