为什么我的线程组列表中有这么多的绑定器和asynctasks?他们是如何管理的?

问题描述 投票:1回答:1

设置:我有服务类和两个绑定它的活动。第一个是调用的主要UI活动

startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE).  

第二个活动仅调用bindService(intent,mConnection,Context.BIND_AUTO_CREATE)。

两者都在onStop()中调用unbindService(mConnection)。

主UI上有一个按钮调用“按钮A”,按下时会将arrayList传递给服务上的方法。然后,服务中的方法启动一个新的静态线程来处理这个arrayList。新线程还有一个静态消息处理程序,用于与服务中的方法进行通信。第二个活动调用服务执行计算,然后将结果保存在数据库中。

我只在服务中明确声明了一个线程。所以我希望总共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]
android android-asynctask android-binder threadgroup
1个回答
0
投票

您应该保留对您创建的AsyncTasks和服务绑定的引用并重用它们(如果需要重新创建它们,则销毁它们)。

请参阅http://developer.android.com/reference/android/app/Activity.html并搜索onSaveInstanceState。

© www.soinside.com 2019 - 2024. All rights reserved.