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

时间:2014-02-16 06:36:18

标签: android android-asynctask android-binder threadgroup

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

的主要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添加到我的线程组列表中?为什么它们会继续扩展?我担心电池消耗,更多的线程意味着更多的电池消耗?或者它只是更快地完成工作,这些自动生成的线程会自动收集垃圾?我有任何内存泄漏吗?我可以控制这些线程的生成方式吗?

我没有找到太多关于此的文档。任何人都明白这件事请告诉我。

第一次运行应用,在主用户界面的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]

我知道主,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]

1 个答案:

答案 0 :(得分:0)

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

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