设置:我有服务类和两个绑定它的活动。第一个是调用的主要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]
您应该保留对您创建的AsyncTasks和服务绑定的引用并重用它们(如果需要重新创建它们,则销毁它们)。
请参阅http://developer.android.com/reference/android/app/Activity.html并搜索onSaveInstanceState。