0

サービスを使用してスレッドを開始しました。このスレッドでは、while ループを記述しました (フラグを設定すると、フラグが true の間、スレッドが実行され、フラグが false の場合、スレッドは何もしないため、停止しますスレッドを手動で)このスレッドで。コードをデバッグすると、スレッドが終了したにもかかわらず、サービスがまだ実行されていることに気付くことがよくありました。Androidシステムによってリサイクルされますか?

スレッドがリサイクルされないようにするにはどうすればよいですか?

======編集=======

「スレッドごとに、終了する前にシステムによって自動的にクリーンアップされます」-スレッドが強制終了されるべきではないときにスレッドが強制終了されていることを意味します

4

2 に答える 2

1

システムが他のことをできるようにするために、ループで Thread.yield() を呼び出していますか? そうでない場合、android は 100% の CPU 使用率を消費するためにスレッドを強制終了している可能性があります。単純なループの場合、スタック トレースは変更されないため、スクリプトがハングします。

http://developer.android.com/reference/java/lang/Thread.html#yield ()

Yield() は、スレッド実行者に、自分のスレッドに戻る前に他のスレッドを停止して実行する必要があることを伝えます。そうしないと、ループは他のアプリからリソースを盗みます

フラグが一定時間変化しないことが確実な場合は、スリープすることもできます

編集 - バックグラウンド- Android がハングしたスレッドを検出する方法です - スレッドが CPU の 100% を占有している場合、スタック トレースをファイルにダンプし、短時間待機してから別のスタック トレースをダンプします - 2 つが一致する場合は、コードが実行を停止したと想定し、アクティビティに対して ANR 'xx is not responsing' ダイアログを発行するか、またはサービスの場合は単純にそれを強制終了して自動的に再起動します。

譲歩することで、100% を消費するのを防ぐことができるため、それを実行しようとすることはありません。

于 2012-09-06T03:03:02.220 に答える
0

あなたのコードが何をしているのか、そしてあなたが何をすべきだと思っているのかさえ不明です。ただし、すぐに解決できることが 1 つあります。

Java (および Android) のスレッドは「リサイクル」しません。スレッドのrun()メソッドが終了すると (復帰するか、何らかの例外の伝播を許可することによって)、再開されることはありません。決して。

また、実行中のスレッドはガベージ コレクションされません。ガベージ コレクションによってスレッドが終了することはありません。

于 2012-09-06T03:02:40.383 に答える