5

アクティビティ (アクティビティ A) からサービス (サービス B) を作成しました。そして、サービス B から、別のサービス (サービス C) を作成しました。以前は、サービス C はサービスではなくスレッドでした。長期的には問題があるので、サービスに変更しました。サービス C は、3 秒間の Thread.sleep 呼び出しで while ループを実行します。しかし、一般的な状態では止まりません。ログには、サービスが実行中であることが示されます。しかし、UI がブロックされ、数分後にシステムがシャットダウンするかどうかを尋ねてきます。

このサービスを非ブロッキング呼び出しにする方法は?

4

4 に答える 4

3

Androidのサービスドキュメントから

サービスは別個のプロセスではありません。Serviceオブジェクト自体は、それが独自のプロセスで実行されていることを意味するものではありません。特に指定がない限り、その一部であるアプリケーションと同じプロセスで実行されます。

サービスはスレッドではありません。これは、メインスレッドから作業を行うための手段ではありません(アプリケーションが応答しないエラーを回避するため)。

この場合の最良の方法は、新しいスレッドを開始し、そこからサービスを呼び出すことです。

于 2012-06-19T10:50:57.543 に答える
3

はい、ドキュメントから、サービスが個別のプロセスではないことは明らかです。代わりに、以下に従って動作させてください。

  1. 開始したい場所からサービスを開始する
  2. 作成したサービスのクラスで、スレッドを拡張する別のプライベート クラスを作成します。これにより、すべてのバックグラウンド処理がメール プロセスとは別のバックグラウンド スレッドで実行されるようになります。
  3. サービスのクラスの onCreate メソッドからスレッドを開始します。onStartCommand でバックグラウンド作業を開始すると、同じタスクを実行する複数のサービスを誤って開始する可能性があります。元。バックグラウンド サービスを開始するボタンをアクティビティに設定しました。複数回クリックすると、その数のサービスがバックグラウンドで開始されます。

    したがって、サービスからオーバーライド onCreate メソッドを使用すると、サービスが既に実行されているかどうかがチェックされ、実行されていない場合はサービスが開始されます。そうしないと、スキップされ、別のサービスが開始されません。

于 2016-05-01T06:37:33.687 に答える
2

サービスCはメインスレッドで実行されていると思います。別のスレッド(新しいスレッドまたは非同期タスク)を作成してみてください

于 2012-06-19T10:47:45.563 に答える
0

サービスは常にメインスレッドで実行されます。TimerTaskUIスレッドのブロックを回避するには、バックグラウンドスレッドを生成するか、サービスCでetcを繰り返し実行する必要があります。

于 2012-06-19T10:49:33.077 に答える