2012-06-19 5 views
5

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

このサービスを非ブロッキングコールにするにはどうすればよいですか?

+1

サービスCのスレッドをメインスレッドでも実行するように作成しましたか? –

+0

サービスBを開始するには、サービスCを開始するだけです。 – dinesh707

+0

サービスBは他のスレッドで作業していますか? –

答えて

3

アンドロイド

におけるサービスのドキュメントからのサービスは別々のプロセスではありません。 Serviceオブジェクト自体は、それ自身のプロセスで実行されていることを意味するものではありません。特に明記されていないかぎり、それが含まれているアプリケーションと同じプロセスで実行されます。

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

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

+0

ですが、これをスレッドで長時間実行すると、アプリケーション全体がクラッシュします。 :( – dinesh707

+0

あなたはコードとエラーログを貼り付けてください? –

2

私は

0

サービスは常にメインスレッド上で実行するサービスCは、メインスレッド上で実行されている、別のスレッド(新しいスレッドまたはasynctask)を作成しようとしていると思います。 UIスレッドをブロックしないように、バックグラウンドスレッドを生成するか、サービスCにTimerTaskなどを繰り返し実行する必要があります。

2

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

    は、すべての背景のものがすることを確認しますどのスレッドを拡張する別のプライベートクラスを書き、あなたが書いたサービスのクラスでは
  1. を開始したい任意の場所からサービスを開始し
  2. メールプロセスとは別のバックグラウンドスレッドで実行します。
  3. onCreateメソッドのサービスクラスからスレッドを開始します。 onStartCommandで背景作業を開始すると、同じタスクを実行している複数のサービスを誤って起動することがあります。 Ex。バックグラウンドサービスを開始するボタンをアクティビティに追加しました。それを何度もクリックすると、バックグラウンドで多数のサービスが開始されます。

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

関連する問題