为什么我的线程组列表中有这么多绑定器和异步任务?它们是如何管理的



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

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

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

两次通话onStop()中的unbindService(mConnection)。

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

我只明确声明了服务中的一个线程。所以我预计总共有2个线程,包括主线程,我只希望有两个绑定器,因为我只有两个绑定到服务的活动。然而,当我在主UI的onCreate中执行Thread.activeCount()时,我最初得到了3个线程。稍后,我得到了4个线程,然后是9个线程和11个线程,按照下面描述的方式进行。

以下是问题
绑定器和异步任务是如何添加到我的线程组列表中的他们为什么不断扩张?我担心电池消耗,线程越多是否意味着电池消耗越多?或者只是工作速度更快,这些自动生成的线程会自行进行垃圾收集?我有内存泄漏吗?我可以控制这些线程是如何生成的吗?

我没有找到太多关于这方面的文件。任何了解此事的人请告诉我。

应用程序的首次运行,在主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

然后我按下主界面上的"按钮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]

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

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

相关内容

  • 没有找到相关文章

最新更新