2016-12-31 11 views
1

私はこの件についていくつかの投稿を見ましたが、どれも満足できる回答はありません。Androidワーカースレッドはどれくらい持続するのですか?

onCreate()メソッドでメイン(唯一)Activityのワーカースレッドを開始するものとします。その後finish()に電話をかけてActivityを終了させます。

その時点で、それに属するタスクは破棄されます(これにはもうActivityが存在しないため)。しかし、アプリケーション(およびそれを実行しているプロセス)は、空の "スケルトン"形式で存在し続けることがあるので、必要に応じて素早く再起動できます(ただし、システムによって殺される可能性は非常に高くなります)。

上記が正しいと仮定すると、ワーカースレッドはいつkillされますか?システムが積極的にプロセスを破壊するときにだけ殺されるのだろうか?

私の場合、ワーカースレッドはBluetooth接続のリスナーとして存在します。受け取ったら、それは再び希望のActivityを起動します。この状況では、実行中のコンポーネント(ActivityServiceContentProviderまたはBroadcastReceiver)はありません。何かが私のワーカースレッドを殺していることを除いて、これはうまくいくはずです。

背景を使用してこれを(そして痛みを少なくして)行うことができることを知っています。Serviceしかし、なぜこれが機能していないのか不思議です。

おかげで、 バリー

+0

私は、Linuxプロセスが破壊されたときにのみスレッドが自動的に殺されると信じています。 – Enzokie

+0

_(http://stackoverflow.com/questions/34463069/can-android [システムアプリのプロセスを終了] _これが唯一の意味することができます「私のワーカースレッドを殺している、これはその何かを除いて、動作するべきであると私には思えます」 -kill-my-app-while-the-of-the-loop-executionである)を使用します。 _ "システムが積極的にプロセスを破壊するときだけ殺されるのですか?"正しいか( 'run()'メソッドが返るかどうか)。 – Onik

+0

合意。問題は、プロセスがいつ殺されるのかとなります。私の推測では、実行中のコンポーネントがなくなってもそれは殺されますが、どこに明示的に記述されているのかわかりません。下のOlegのBroadcastReceiverレスポンスへの私の返答でもっと詳しく。 –

答えて

0

Android App lifecycleは非常に話題にある素敵な例があります。

プロセスのライフ・サイクルのバグの一般的な例としては、それがその BroadcastReceiver.onReceiveにテントを受信したときに、スレッドを開始するBroadcastReceiver です()メソッドを呼び出し、 関数から戻ります。それが戻ってくると、システムはBroadcastReceiver がアクティブではなくなったとみなし、そのホストプロセスはもう を必要としなくなりました(他のアプリケーションコンポーネントがアクティブでない限り)。したがって、システム は、いつでもメモリを再利用するためにプロセスを終了させることがあり、そうすることで、プロセス内で実行されている生成されたスレッドを終了させます。 、短いその本当に非常に予測不可能で

あなたはスレッド場合は、終了またはプロセスが事前に殺されるまで、実行する機会を得るでしょう、あなたは間違いなく、任意の順序/動作に依存しないでください。フォートワース

個別に言及、そのスレッドと一緒にそのかなり簡単leakにごアクティビティ作業が終了した場合でも()は、しかし、もしそのあなた/あなたがスレッドを起動すると、それは絵

+0

アクティビティに参照がある場合、彼はアクティビティだけをリークします。スレッドが何らかの方法でアクティビティを参照せず、静的内部クラスまたは非内部クラスのいずれかである場合、アクティビティのリークはなく、スレッドクラスが保持する参照のみです。 –

+0

彼は明示的な参照を必要としません。暗黙の参照とブームを得るためにonCreateの新しいThread(){...}を言うのに十分です。 –

+0

いいえ、それはありません。これは、スレッドが静的ではない内部クラスである場合にのみ当てはまります。あなたの例はどれですか(静的ではない匿名の内部クラスですが、そうである必要はありません)。静的内部クラスには、親クラスへの参照がありません。 –

-1

1つのメイン(UIも呼ばれる)のAndroid内のスレッドがあります。 Thread.start()AsyncTask.execute()などで明示的に起動しない限り、アプリケーションで使用するのはスレッドだけです。すべてのアクティビティ、サービス、ブロードキャスト受信者などは、すべてのライフサイクルメソッドをメインスレッドで実行します。通知サービスを含める - サービスは独自のスレッド(例外はIntentServiceで、これは独自のスレッドで実行されます)を開始しない限り、メインスレッドで実行されます。

Threadあなたは、Runnableが実行機能から返されるまで(またはもちろんプロセスが終了して)、作成を続けます。これはによって作成されたActivity/Serviceの終わりを過ぎて生きることができます。しかし、このようなスレッドはコンポーネントの元のインスタンスにまだ存在しており、特別な作業をしなくても再起動した場合、新しいインスタンスの変数にアクセスすることはできません(「Loaderパターン」を参照)。

+0

あなたの声明と矛盾するものはどこに書いてありますか?彼はただのonCreate –

+0

修正メインスレッドからスレッドです**時々**と呼ばれるUIスレッドを生み出しました。思考のonCreateがスレッドを立ち上げて – Enzokie

+0

@OlegBogdanovは、私が最初に彼の質問を読み違えます。私はあなたが間違った部分を削除しました。 –

0

を変更しないだけの活動最後の、それを開始した親とは独立しています。あなたのケースでは、あなたのアプリケーション活動です。つまり、Runメソッドが完全に実行されるまで、スレッドは存続します。

あなたは、アプリケーションを終了し(そのための活動のonStopメソッドを呼び出す)場合は、スレッドがまだ存在しますが、あなたはメモリリークが発生します。メモリが足りなくなったら、最終的にシステムによって殺されるでしょう。

あなたはBluetooth接続をリッスンするリスナーを作成したことに言及しているので、それは(私は任意のコードスニペットせずに知ることは不可能である)任意のイベントを受信する前に、あなたのスレッドは、おそらく死にます。スレッドを終了させるクラッシュも発生する可能性があります。ワーカースレッドが殺され

+0

メモリリークは、スレッドがアクティビティ参照を保持している場合にのみ発生します。 – Enzokie

+0

このスレッドは、アクティビティ以外のものへの参照を保持することができ、参照のリークを引き起こす可能性があります。 –

+0

明確化:ワーカースレッドが存在し続けるようにしたいのですが、その後に新しいスレッドを生成しないように注意します。概念的には、少なくとも、それが入ってくるブルートゥースリクエストを受け入れ、それが起こったときに関連するアクティビティを起動することを可能にする。だから、メモリリークはありません(私がワーカースレッドを慎重にコーディングしている限り)。ワーカースレッドの目的のために保持しようとするメモリだけです。 –

1

?システムが積極的にプロセスを破壊するときにだけ殺されるのだろうか?

- >ワーカースレッドは、すべてのコードがrunで実行された後に熟練しています。あなたのactivityが破壊されてもまだ実行されます。

私の場合、ワーカースレッドはBluetooth接続のリスナーとして存在します。受け取ったら、それは再び目的のアクティビティを起動します。この状況では、実行中のコンポーネント(Activity、Service、ContentProvider、またはBroadcastReceiver)は実行されません。何かが私のワーカースレッドを殺していることを除いて、これはうまくいくはずです。

はあなたServiceなどから任意のコンポーネントを起動するEventBusを使用して、あなたがこの場合のバックグラウンドserviceを持っているし、あなたのワーカースレッド以上の単純なものから、あなたのservicesoft/weak参照を作成する必要があり、それが動作するには:

EventBus.getDefault().post(new BlueToothEvent()); // call in your worker thread 
// do something in your service 
onBlueToothEventFired(BlueToothEvent e); 
関連する問題