1

セットアップ: サービス クラスとそれにバインドする 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]
4

1 に答える 1