セットアップ: サービス クラスとそれにバインドする 2 つのアクティビティがあります。1 つ目は、呼び出すメインの UI アクティビティです。
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE).
2 番目のアクティビティは bindService(intent, mConnection, Context.BIND_AUTO_CREATE) のみを呼び出します。
どちらも onStop() で unbindService(mConnection) を呼び出します。
メイン UI にボタン呼び出し "button A" があり、これを押すと arrayList がサービスのメソッドに渡されます。次に、サービス内のメソッドが新しい静的スレッドを開始して、この arrayList を処理します。新しいスレッドには、サービス内のメソッドと通信するための静的メッセージ ハンドラーもあります。2 番目のアクティビティは、サービスを呼び出して計算を実行し、結果をデータベースに保存します。
サービスで 1 つのスレッドのみを明示的に宣言しました。したがって、メイン スレッドを含めて合計 2 つのスレッドが必要であり、サービスにバインドするアクティビティが 2 つしかないため、バインダーは 2 つしか期待できません。ただし、メイン UI の onCreate で Thread.activeCount() を実行すると、最初は 3 つのスレッドが取得されます。後で 4 つのスレッドを取得し、次に 9 つのスレッドと 11 のスレッドが続き、以下で説明する方法で処理を進めます。
ここに質問があります。
バインダーと asynctasks はどのようにスレッド グループのリストに追加されますか? なぜ彼らは拡大し続けるのですか?バッテリーの消費が気になります。スレッドが増えるとバッテリーの消費量が増えますか? それとも、作業が速くなり、これらの自動生成されたスレッドが自分自身をガベージ コレクションしますか? メモリリークはありますか?これらのスレッドが生成される方法を制御できますか?
これに関するドキュメントはあまり見つかりませんでした。この件についてわかる方、教えてください。
アプリの最初の実行、メイン UI の onCreate で:
ThreadGroup ctg = Thread.currentThread().getThreadGroup(); ctg.list();
リストには次のものが表示されます。
I/System.out(18606): Thread[main,5,main]
I/System.out(18606): Thread[Thread-5,5,main]
I/System.out(18606): Thread[Binder_1,5,main]
I/System.out(18606): Thread[Binder_2,5,main]
main、Binder_1、Binder_2 が 3 つのアクティブなスレッドであることはわかっています。 電話の向きを変えると、logcat は次のように表示します。
MainActivity onStop unbindService
MainActivity onDestroy() plus debuginfo --Pid is 18606, threadid is 18606, there are 4 threads
MainActivity onCreate() plus debuginfo --Pid is 18606, threadid is 18606, there are 4 threads
I/System.out(18606): java.lang.ThreadGroup[name=main,maxPriority=10]
I/System.out(18606): Thread[main,5,main]
I/System.out(18606): Thread[Thread-5,5,main]
I/System.out(18606): Thread[Binder_1,5,main]
I/System.out(18606): Thread[Binder_2,5,main]
I/System.out(18606): Thread[Binder_3,5,main]
Service onStartCommand() 2--Pid is 18606, threadid is 18606, there are 4 threads
次に、メイン UI の「ボタン A」を押して、新しいスレッドを作成して arraylist を処理すると、11 個のスレッドが取得されます。 Logcat ショー:
D/Service(18606): in processRuleOnArrayList -- ACTUALLY MADE A NEW THREAD
D/BoundService(18606): processRuleOnArrayList(): --Pid is 18606, process threadid is 18606, service threadid is 2930, service threadname is serviceName_0, there are 11 threads
D/Service(18606): processRuleOnArrayList(): service thread's threadGroup main, main thread's threadGroup java.lang.ThreadGroup[name=main,maxPriority=10]
I/System.out(18606): java.lang.ThreadGroup[name=main,maxPriority=10]
I/System.out(18606): Thread[main,5,main]
I/System.out(18606): Thread[Thread-5,5,main]
I/System.out(18606): Thread[Binder_1,5,main]
I/System.out(18606): Thread[Binder_2,5,main]
I/System.out(18606): Thread[Binder_3,5,main]
I/System.out(18606): Thread[AsyncTask #1,5,main]
I/System.out(18606): Thread[AsyncTask #2,5,main]
I/System.out(18606): Thread[AsyncTask #3,5,main]
I/System.out(18606): Thread[AsyncTask #4,5,main]
I/System.out(18606): Thread[AsyncTask #5,5,main]
I/System.out(18606): Thread[Binder_4,5,main]
I/System.out(18606): Thread[serviceName_0,5,main]