Binder服务作为单独的线程

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

我创建了要在单独的进程中运行的服务

<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请求时,我都使用了活动进程堆中存在的对象,即它在主线程上。

我的推论正确吗?

android multithreading android-service aidl
3个回答
3
投票

不查找线程信息,而是打印出进程和/或线程ID以确认服务和应用程序是否在单独的线程/进程中运行。

android.os.Process.myPid()/android.os.Process.myTid()

0
投票

AIDL docs


0
投票

bindService()在服务的进程中创建一个binderThread(创建一个新的MainThread),该进程属于“主”组。因此,从技术上讲,AIDL存根接口内部的方法是在不同的进程上运行,但在主线程上运行。要解决此问题,您可以使用IntentService来启动工作线程,但是如果必须从AIDL方法返回该值,则可以在服务中使用HnadlerThread并使用回调来完成。下面是示例

MyAIDLInterface.aidl

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