我创建了要在单独的进程中运行的服务
<service
android:name="dashboard.main.InterfaceService"
android:exported="false"
android:process=":ServiceProcess" >
</service>
我已经读过,当服务作为单独的进程提供时,它位于单独的线程而不是主线程上。当我在服务中执行HTTP请求时,出现异常:Thread forbids Http
。
主线程和服务线程的线程信息都是相同的主线程:(id)1:(priority)5:(group)main
。
[service是started/bind()
中的MainActivity
。之间的交互是使用AIDL。
连接服务后,MainActivity持有服务返回的对象的引用,我使用该对象进一步调用服务方法。
在DDMS视图中,两个单独的过程可见请帮助,我需要使服务在其自己的线程上运行
------------新信息如“ acj”建议-我在所有课程中都进行了PID检查。由于两个进程都有不同的堆,因此通过AIDL从我的服务返回的对象在活动堆中又作了一个副本。因此,每次我使用该对象启动Http请求时,我都使用了活动进程堆中存在的对象,即它在主线程上。
我的推论正确吗?
不查找线程信息,而是打印出进程和/或线程ID以确认服务和应用程序是否在单独的线程/进程中运行。
android.os.Process.myPid()/android.os.Process.myTid()
bindService()在服务的进程中创建一个binderThread(创建一个新的MainThread),该进程属于“主”组。因此,从技术上讲,AIDL存根接口内部的方法是在不同的进程上运行,但在主线程上运行。要解决此问题,您可以使用IntentService来启动工作线程,但是如果必须从AIDL方法返回该值,则可以在服务中使用HnadlerThread并使用回调来完成。下面是示例
MyAIDLInterface.aidl